Страницы

Поиск по вопросам

вторник, 5 февраля 2019 г.

Виртуальное наследование: проблема с вызовом конструктора с параметрами при создании объекта

При ромбовидном наследовании не вызывается конструктор с параметрами, при создании объекта производного. Т.е. если в мэйне будет: 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]; }; Извините, конечно, за простейший вопрос, но я не могу разобраться =)


Ответ

И не получится. На то оно и виртуальное наследование. Конструктор базового класса при виртуальном наследовании надо вызывать явно class D{ ......... D (int N, char C, double D, char* Str) : C (D), B (C), A(N) { strcpy (str, Str); } ......... };

Комментариев нет:

Отправить комментарий