什么是 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 的值。

以上是 什么是 C++ 中的虚拟基类? 的全部内容, 来源链接: utcz.com/z/311392.html

回到顶部