多继承二义性、虚继承和虚基类

为了解决多继承时的命名冲突问题,C++ 提出了虚继承。虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。这个被共享的基类就称为虚基类。

虚继承的使用:

格式:
在继承方式前面加上 virtual 关键字就是虚继承
复制代码
#include <iostream>

using namespace std;

class A
{
public:
    int temp;
};

class B : public A
{
};

class C : public A
{
};

class D : public B, public C
{
};

int main(int argc, char *argv[])
{
    D d;
    // cout << &d.temp<< endl; // 报错:多继承命名冲突,产生二义性问题
    cout << &d.B::temp << endl;
    cout << &d.C::temp << endl;

    return 1;
}

输出:
0x61fe18
0x61fe1c
复制代码

使用虚继承后,不再命名冲突

复制代码
#include <iostream>

using namespace std;

class A
{
public:
    int temp;
};
// 使用虚继承
class B : virtual public A
{
};
// 使用虚继承
class C : virtual public A
{
};

class D : public B, public C
{
};

int main(int argc, char *argv[])
{
    D d;
    cout << &d.temp<< endl; // 使用虚继承后,没有命名冲突了
    cout << &d.B::temp << endl;
    cout << &d.C::temp << endl;

    return 1;
}

输出:
0x61fe10
0x61fe10
0x61fe10
复制代码

总结:
可以看到,使用多继承经常会出现二义性问题,必须十分小心。上面的例子是简单的,如果继承的层次再多一些,关系更复杂一些,程序员就很容易陷入迷魂阵,程序的编写、调试和维护工作都会变得更加困难,因此我不提倡在程序中使用多继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多继承,能用单一继承解决的问题就不要使用多继承。也正是由于这个原因,C++ 之后的很多面向对象的编程语言,例如 Java、C#、PHP 等,都不支持多继承。

posted @   jason8826  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示