Я слышал, что использование виртуального ключевого слова решает проблему с алмазом.Наследование диалогов в множественном наследовании с использованием ключевого слова Virtual
Однако, когда я сделал это:
#include <iostream>
using namespace std;
class A {
public:
A(int x = 100) {
num = x;
}
protected:
int num;
};
class B1 : virtual public A{
public:
B1(int x = 50) : A(2*x) {
}
};
class B2 : virtual public A{
public:
B2(int x = 50) : A(2*x) {
}
};
class C : public B1, public B2 {
public:
C(int x = 75) : B1(2*x), B2(2*x) {};
int getData(){ return num; }
};
int main() {
C c(10);
cout << c.getData();
cin.get();
return 0;
}
Он отображает вывод как 100 вместо того, что я ожидал, т.е. 40. Почему?
Виртуальный базовый класс инициализируется в * наиболее производном классе * (тип фактического объекта, который вы создаете). Поскольку для 'A' в' C' нет инициализатора, аргумент конструктора 'A' по умолчанию равен 100. – dyp
Или любой базовый класс? –
Простите, я не понимаю, о чем вы говорите. – dyp