【C++】虚继承相关问题

【c++】虚继承实例代码

虚继承就是为了解决二义性而产生的。 分为成员变量二义性和成员函数二义性 不调用同名成员则不产生二义性问题

为什么虚继承能够解决?

因为有了虚继承后能够让虚基类(基类还是那个基类,变化的只是继承时候的方式,加了关键字virtual使得继承方式变为了虚继承,此时基类就成为了虚基类,与抽象类完全不同!)中的成员只保存一份,不在子类中进行初始化。只有一个成员,自然不会产生二义性。

虚继承示例代码

#include <iostream>
using namespace std; 

class A
{
          
   
public:
	int _a;
	A(int a = 0) :_a(a) {
          
    cout << "A()" << endl; }
	~A() {
          
    cout << "~A()" << endl; }
};
class B :virtual public A
{
          
   
	public:
	B():A(99) {
          
    cout << "B()"<< _a << endl; }
	~B() {
          
    cout << "~B()" << endl; }
};
class C:virtual public A
{
          
   
	public:
	C() :A(100)  {
          
    cout << "C()" << _a << endl; }
	~C() {
          
    cout << "~C()" << endl; }
};
class D:virtual public C, virtual public B
{
          
   
public:
	D():A(101) {
          
    cout << "D()" << _a << endl; }
	~D() {
          
    cout << "~D()" << endl; }
};

int main()
{
          
   
	D d;
	return 0;
}

可以看出虚基类只被初始化一次,是在最底层的子类创建时,虚基类被创建。

如果底层子类不调用:

除此之外,虚基类的创建还发生在自己创建的时候(如果底层子类没有调用构造函数) 虚继承只解决菱形继承的问题,其他多继承无需使用虚继承解决
经验分享 程序员 微信小程序 职场和发展