C++ 虚基类

虚基类(Virtual Base Class)在面向对象编程中的作用是解决多重继承中的菱形继承问题(Diamond Inheritance Problem)和共享基类问题(Shared Base Class Problem)。

菱形继承问题是指当一个类以多种路径继承自同一个基类时,会导致该基类在派生类中存在多个实例,造成冗余和二义性。虚基类通过在派生类中使用虚继承来解决菱形继承问题。虚基类允许在派生类中共享同一个基类实例,从而消除了冗余和二义性。

共享基类问题是指在多重继承中,派生类的不同分支共享同一个基类,但每个分支通过独立的路径继承,导致基类在派生类中存在多个实例。虚基类可以用于共享基类,确保派生类中的虚基类实例只有一个,从而避免数据冗余和一致性问题。

虚基类的主要作用是:

  1. 消除冗余:通过使用虚基类,避免在派生类中出现多个基类实例,从而消除了数据和函数的冗余。

  2. 解决二义性:在菱形继承中,虚基类确保派生类只有一个基类实例,消除了由多个路径继承引起的二义性问题。

  3. 维护一致性:通过共享基类实例,虚基类确保派生类中的基类数据保持一致,避免了数据一致性问题。

相关:C++ 虚基类

 

#include <iostream>
using namespace std;
class Base0 {
public:
	int var0;
	void fun0() { cout << "Member of Base0" << endl; }
};
class Base1 : virtual public Base0 {
public:
	int var1;
};
class Base2 : virtual public Base0 {
public:
	int var2;
};

class Derived : public Base1, public Base2 {
	//定义派生类Derived 
public:
	int var;
	void fun() {
		cout << "Member of Derived" << endl;
	}
};

int main() {
	Derived d;
	d.var0 = 2; //直接访问虚基类的数据成员
	d.fun0();   //直接访问虚基类的函数成员
	return 0;
}

结果:Member of Base0

posted @ 2023-07-19 11:01  strive-sun  阅读(181)  评论(0编辑  收藏  举报