菱形继承问题:
父类1 和 父类2 继承于同一 父类
子类同时继承 父类1 和 父类2 时就会产生 子类中 有多个相同的属性
虚继承:
子类同时继承 父类1 和 父类2 时就会产生 子类中 只有一个这个属性
(原理,虚继承利用 vbptr 指向了 vbtable 指向了 基类的变量)
#include<iostream>
#include<cstdio>
using namespace std;
class A{
public:
int _a = 10;
};
class B_A:public A{
// int _a = 10;
};
class C_A:public A{
// int _a = 10;
};
class D: public B_A, public C_A{
public:
int _d = 20;
};
void f(){
// 菱形继承导致 D 中有 B_A 的 _a 和 C_A 的 _a 再加上 D 自己的 _d 一共有 12 个字节
cout<<sizeof(D)<<endl;
D d = D();
// 有两份 _a
cout<<d.B_A::_a<<endl;
cout<<d.C_A::_a<<endl;
// 报错
// cout<<d._a<<endl;
}
int main(){
f();
return 0;
}
#include<iostream>
//#include<cstdio>
using namespace std;
class A{
public:
int _a = 10;
};
class B_A: virtual public A{
// int *p 指向了 _a;
};
class C_A: virtual public A{
// int *p 指向了 _a
};
class D: public B_A, public C_A{
public:
int _d = 20;
};
void f(){
// 菱形继承导致 D 中有 B_A 的 _a 和 C_A 的 _a
cout<<sizeof(D)<<endl;
cout<<sizeof(B_A)<<endl;
cout<<sizeof(C_A)<<endl;
D d = D();
cout<<d._a<<endl;
}
int main(){
f();
return 0;
}