#наследование #cpp
При ромбовидном наследовании не вызывается конструктор с параметрами, при создании объекта производного. Т.е. если в мэйне будет: D object (1, 'c', .99, ""); cout << object; то в таком случает вместо желаемого вызова A(N), который по логике должен вызываться согласно цепочке, вызывает конструктор без параметров. Сама мини-иерархия: class A { public: A () {} A (int N) : n (N) {} protected: int n; }; class B : virtual public A { public: B () : A () {} B (int N, char C) : A (N), c (C) {} protected: char c; }; class C : virtual public A { public: C () : A () {} C (int N, double D) : A (N), d(D) {} protected: double d; }; class D : public B, public C { public: D () : B (), C () {} D (int N, char C, double D, char* Str) : C (N, D), B (N, C) { strcpy (str, Str); } friend ostream& operator << (ostream& out, const D& operand) { out << operand.n << " " << operand.c << " " << operand.d << " " << operand.str << endl; return out; } friend istream& operator >> (istream& in, D& operand) { cout << "int : "; cin >> operand.n; cout << "char : "; cin >> operand.c; cout << "double : "; cin >> operand.d; cout << "string : "; cin >> operand.str; return in; } protected: char str[20]; }; Извините, конечно, за простейший вопрос, но я не могу разобраться =)
Ответы
Ответ 1
И не получится. На то оно и виртуальное наследование. Конструктор базового класса при виртуальном наследовании надо вызывать явно class D{ ......... D (int N, char C, double D, char* Str) : C (D), B (C), A(N) { strcpy (str, Str); } ......... };
Комментариев нет:
Отправить комментарий