什么是 C++ 中的虚拟基类?
当派生类具有基类的多个副本时,将使用虚拟基类。
示例代码
#include <iostream>
using namespace std;
class B {
public: int b;
};
class D1 : public B {
public: int d1;
};
class D2 : public B {
public: int d2;
};
class D3 : public D1, public D2 {
public: int d3;
};
int main() {
D3 obj;
obj.b = 40; //语句1,会出现错误
obj.b = 30; //语句2,会出现错误
obj.d1 = 60;
obj.d2 = 70;
obj.d3 = 80;
cout<< "\n B : "<< obj.b
cout<< "\n D1 : "<< obj.d1;
cout<< "\n D2: "<< obj.d2;
cout<< "\n D3: "<< obj.d3;
}在上面的例子中,D1和D2都继承了B,它们都有一个B的副本。但是,D3继承了D1和D2,因此D3有两个B副本,一个来自D1,另一个来自D2。
上面示例中的语句1和2将产生错误,因为编译器无法区分D3中b的两个副本。
要从D3中删除B的多个副本,我们必须将D1和D3中的B作为虚拟类继承。
因此,上面使用虚拟基类的示例将是-
示例代码
#include<iostream>
using namespace std;
class B {
public: int b;
};
class D1 : virtual public B {
public: int d1;
};
class D2 : virtual public B {
public: int d2;
};
class D3 : public D1, public D2 {
public: int d3;
};
int main() {
D3 obj;
obj.b = 40; //陈述3
obj.b = 30; //陈述4
obj.d1 = 60;
obj.d2 = 70;
obj.d3 = 80;
cout<< "\n B : "<< obj.b;
cout<< "\n D1 : "<< obj.d1;
cout<< "\n D2 : "<< obj.d2;
cout<< "\n D3 : "<< obj.d3;
}输出结果B : 30 D1 : 60 D2 : 70 D3 : 80
现在,D3只有B的一份副本,语句4将覆盖语句3中给出的b的值。
作者头像
作者名称
作者性别



评论列表