Наследование от множественного наследования

0

Возникли проблемы с множественным наследованием. Я решил проблему с алмазами:

class A
{
    int m;
    int n;
public:
    A(int x, int y)
    {
        m = x; n = y
    }
    fA() {}
};

class B : virtual public A // B has fA(),fB()
{
public:
    B(int k) : A(1, k) {}
    fB() {}
};

class C : virtual public A // C has fA(),fC()
{
public:
    C(int k) : C(2, k) {}
    fC() {}
};

class D : public B, public C // D has fA(),fB(),fC()
{
public:
    D(int k) : B(k),C(k),A(3,k)
};

Это хорошо работает. Проблема с этим:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6) {}
};

Компилятор показывает мне: "ошибка: нет соответствующей функции для вызова" A :: A() ")

Этот код работает, но меня это не удовлетворяет:

class S : public B // S has fA(),fB()
{
public:
    S() : B(6),A(1,6) {}
};
  • 1
    Самый производный класс отвечает за создание виртуальной базы. Вот как работает язык.
  • 1
    Можете ли вы проверить правильность написания кода в C ++? Есть ряд причин, по которым этот код не будет компилироваться, и лучше, если нам не придется угадывать, какие из них связаны с вашим вопросом, а какие - просто опечатки.
Теги:
inheritance

1 ответ

6
Лучший ответ

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

class S : public B // S has fA(),fB()
{
public:
    S() :   B(6) {}
};  //    ^  A base class is initialized at this point, before B

Это также означает, что другие явные вызовы конструктора A в списках инициализации далее вниз по цепочке наследования игнорируются:

class B : virtual public A // B has fA(),fB()
{
public:
    B(int k) : A(1, k) {}
    fB() {} // ^^^^^^^    this call is ignored when B is a part of S object
};

Если в списке инициализации большинства производного класса нет явного вызова конструктора виртуальной базы, компилятор (конечно же) попытается вызвать конструктор по умолчанию. Но у A нет такой, а твоя проблема.

Одно из решений, которое вы уже обнаружили сами. Другой - написать конструктор по умолчанию для A

Ещё вопросы

Сообщество Overcoder
Наверх
Меню