C++多继承的二义性
多继承的二义性主要分为两种:
(1) 调用不同基类的同名成员时可能出现二义性
(2) 菱形继承下访问共同基类的成员可能出现二义性
/*多继承下调用不同基类的同名成员时可能出现二义性*/ #include<iostream> #include<stdio.h> using namespace std; class A { public: void setA(int a); int get() { printf("A::get()\n"); } private: int a; }; class B { public: void setB(int b); int get() { printf("B::get()\n"); } private: int b; }; class C:public A,public B { public: void setC(int c); int getC() { printf("C::getC()\n"); } private: int c; }; int main() { C obj; obj.get();//这行有问题 return 0; }
在执行obj.get();时将是有二义性的。因为类C分别从类A类B继承了两个不同版本的get()成员函数,因此,obj.get();到底调用哪个get()版本,编译器将无从知晓。
有两种解决方法:
1、使用作用域分辨符::加以消除。
obj.A::get();
obj.B::get();
2、在类C中也定义成员函数get()函数,则有类C的对象obj访问get()函数obj.get()没有二义性,这是因为当派生类中的成员与基类中的成员重名时,派生类中的同名成员将被调用。
/*访问共同基类的成员可能出现二义性*/ #include<iostream> #include<stdio.h> using namespace std; class A { public: void fun(); private: int a; }; class B1 { public: void funB1(); private: int b1; }; class B2:public A { public: void funB2(); private: int b2; }; class C:public B1,public B2 { public: void funC(); private: int c; }; int main() { /* 在此类结构下,如果创建类C的对象c1: C c1; 则下面的两个访问都有二义性: c1.fun(); c1.A::fun(); 不过下面的两条调用语句却是正确的: c1.B1::fun(); c1.B2::fun(); ***解决方法:采用虚基类的方式*** */ return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!