Рассмотрим:
#include <iostream>
using namespace std;
class A {// base class
private:
int data;
public:
A(int data = 0)
{
this->data = data;
}
void show()
{
cout << data << endl;
return;
}
};
class B : virtual public A {
public:
B(int data = 0) :
A(data) {
}
};
class C : virtual public A {
public:
C(int data = 0) :
A(data) {
}
};
class D : public B, public C {
public:
D(int dataB = 0, int dataC = 0) :
B(dataB),
C(dataC) {
}
};
int main() {
D d(1, 2);
d.B::show();
d.C::show();
return 0;
}
Вышеприведенный код - диаграмма наследования класса алмаза. Базовый класс - A. Я использую виртуальное наследование, чтобы избежать проблемы с алмазом. Но почему вывод этой программы 0,0, а не 1,2, как я ожидаю?
B
конструктор передается data=1
, а в его списке инициализаторов он вызывает A
с data
. C
подобный конструктор передается data=2
, а его список инициализаторов вызывает A
с data
.
Затем мы задаем подбогам B
и C
для show
их значение. И мы получаем 0
0
не 1
2
, как я ожидаю.