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