什么是 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; //Statement 1, error will occur obj.b = 30; //statement 2, error will occur 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; // statement 3 obj.b = 30; // statement 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 的值。
广告