Страницы

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

воскресенье, 5 января 2020 г.

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

#наследование #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); } ......... };

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

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