не смотрите на название темы, по ходу дела пришлось перефразировать вопрос))) есть класс Parent... от него наследуются классы Child1, ..., ChildN... в классе Parent определен конструктор копирования из объекта класса Parent... а так же набор операторов... в наследниках этот функционал перегружается своими реализациями... каким образом грамотно сделать конструктор копирования в наследниках, чтобы была возможна запись: Код (Text): ChildX chx; ChildY chy = chx; и тот же вопрос по поводу оператора, например: Код (Text): ChildX chx; ChildY chy; Childz chz; chx = chx + chy; запись вида: Код (Text): ChildX::ChildX(Parent& Obj) { ... } Parent& ChildX::operator +(Parent& Obj) { ... } не дает нужного результата...
Код (Text): class Parent { public: int i; Parent() { i = 2; } void print() { printf("%i\n",i); } Parent& operator+(Parent&u) { i += u.i; return *this; } }; class ChildX : public Parent { public: ChildX() { i=3; } }; class ChildY : public Parent { public: ChildY(Parent&x) { i=x.i; }; }; int main() { ChildX cx; ChildY cy = cx; cy.print(); cy = cy + cx; cy.print(); return 0; }
спасибо... у меня пока что возникают странные проблемы... если два наследника через оператор тайпкаста совместимы со стандартным типом и оба имеют конструктор/оператор = совместимый с этим типом, то копирование происходит через стандартный тип, а не через родителя...
Код (Text): #include <iostream> class Parent { public: Parent() { std::cout << "ParentDef" << std::endl; } Parent(const Parent &) { std::cout << "ParentCopy" << std::endl; } operator int () const { return 0; } }; class Child1: public Parent { public: Child1() { std::cout << "Child1Def" << std::endl; } template <typename T> Child1(const T &t): Parent(t) { std::cout << "Child1Copy" << std::endl; } operator int () const { return 1; } }; class Child2: public Parent { public: Child2() { std::cout << "Child2Def" << std::endl; } template <typename T> Child2(const T &t):Parent(t) { std::cout << "Child2Copy" << std::endl; } operator int () const { return 2; } }; int main(int argc, _TCHAR* argv[]) { Child1 c1; Child2 c2 = c1; return 0; }