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;
}
复制代码

 

posted @   韓さん  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示