C++之虚继承

虚继承

虚继承是C++中一种特殊的继承方式,主要用来解决多重继承中菱形继承问题。在菱形继承结构中,一个类继承来自两个具有共同基类的类时,会导致共同基类的成员在派生类中存在两份拷贝,这不仅会导致资源浪费,还可能引起数据不一致的问题。虚继承通过确保共同基类的单一实例存在于继承层次中,来解决这一问题。

菱形继承例子

class Base {
public:
    int data;
};

class Derived1 : public Base {
    // 继承自 Base
};

class Derived2 : public Base {
    // 继承自 Base
};

class FinalDerived : public Derived1, public Derived2 {
    // 继承自 Derived1 和 Derived2
};

在这个例子中,FinalDerived 类通过 Derived1Derived2 间接地继承自 Base 类两次。因此,它包含了两份 Base 的成员拷贝。

使用虚继承解决菱形继承问题

只需要在继承前面加 virtual 即成为虚继承

class Base {
public:
    int data;
};

class Derived1 : virtual public Base {
    // 虚继承 Base
};

class Derived2 : virtual public Base {
    // 虚继承 Base
};

class FinalDerived : public Derived1, public Derived2 {
    // 继承自 Derived1 和 Derived2
};

通过将 Derived1Derived2Base 的继承声明为虚继承( virtual public Base ),FinalDerived 类中只会有一份 Base 类的成员。无论通过 Derived1 还是 Derived2 的路径,访问的都是同一个 Base 类的成员。

#include <iostream>

using namespace std;

class Base
{
public:
    int data;
    Base(int data)
    {
        this->data = data;
    }
    void printInfo()
    {
        cout << data << endl;
    }
};

class Derived1 : virtual public Base
{
public:
    Derived1(int data) : Base(data)
    {

    }
};

class Derived2 : virtual public Base
{
public:
    Derived2(int data) : Base(data)
    {

    }
};

class FinalDerived : public Derived1, public Derived2
{
public:
    FinalDerived(int data) : Base(data), Derived1(data) , Derived2(data)
    {

    }
};

int main()
{
    FinalDerived final(10);
    final.printInfo();
    return 0;
}

特点和注意事项

  1. 初始化虚基类:在使用虚继承时,虚基类(如上述例子中的 Base 类)只能由派生的类(如 FinalDerived)初始化。
  2. 内存布局:虚继承可能会改变类的内存布局,通常会增加额外开销,比如虚基类指针。
  3. 设计考虑:虚继承应谨慎使用,因为他增加了复杂性。在实际应用中,如果可以通过其他设计(如组合或接口)来避免菱形继承,那通常是更好的选择。

虚继承时C++语言中处理复杂继承关系的一种重要机制,但它也带来了一定的复杂性和性能考虑。正确地使用虚继承可以帮助你建立清晰、有效的类层次结构

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值