一、造成二义性的情况和虚继承的解决方案
#include <iostream>
using namespace std;
class B
{
public:
int b;
};
class B1: virtual public B
{
public:
int b1;
};
class B2: virtual public B
{
public:
int b2;
};
class C : public B1, public B2
{
public:
int c;
};
void main()
{
C c;
c.c=10;
c.b1=10;
c.b2 = 10;
c.b = 10;//会造成二义性 和虚继承解决方案 爸爸要是虚的
system("pause");
}
二、什么情况下使用虚继承
#include<iostream>
using namespace std;
class A
{
public:
int k;
};
class A1
{
public:
int k;
};
class B:virtual public A,virtual public A1
{
};
void main()
{
B b1;
//继承的两个基类中都含有k 所以会造成二义性 这个时候虚继承并不能解决这个问题
//这个时候虚继承并不能解决这个问题 只能程序员手工的去实现
//b1.k = 10;
b1.A::k;//只能手工的去解决问题
system("pause");
}
三、加上virtual之后,变量的大小发生变化
#include<iostream>
using namespace std;
class A
{
public:
int k;
};
class B1:virtual public A
{
public:
int k;
};
class B :public A
{
public:
int c;
};
void main()
{
cout << sizeof(A)<< endl;//输出为4
cout << sizeof(B1) << endl;//输出为12 加上virtual 之后,C++编译器会自动给变量增加属性
cout << sizeof(B) << endl;//输出为8
system("pause");
}