多继承二义性、虚继承和虚基类
为了解决多继承时的命名冲突问题,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 等,都不支持多继承。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!