MikerNO_8 2024-03-13 10:47 采纳率: 0%
浏览 1

多继承中基类有同名成员和成员函数时怎么使用using澄清二义性

多继承中基类有同名属性和成员函数时怎么使用using澄清二义性

代码如下

#include <iostream>
using namespace std; 

class Base1{
public:
    int var;
    void fun(){cout<<"Base1"<<endl;}    
};

class Base2{
public:
    int var;
    void fun(){cout<<"Base2"<<endl;}        
};

class Derived:public Base1,public Base2{
public:
    using Base1::var;//加using澄清二义性 
    using Base1::fun;//加using澄清二义性         
};

class Derived2:public Base1,public Base2{
public:
    using Base1::fun;//加using澄清二义性 报错不能调整访问权限到此类中
    void fun(int i){cout<<"Dervied2"<<endl;}        
};

int main(){
    Derived d;
    Derived *p=&d;
    
    d.var=1;//报错请求不明确 
    d.fun();//报错请求不明确 
    
    d.Base1::var=2;
    d.Base1::fun();
    
    p->Base2::var=2;
    p->Base2::fun();
    
    return 1;
}

报错截图

img


using为什么没有作用

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-13 10:47
    关注

    MikerNO_8 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在多继承中,如果基类有同名成员和成员函数,可以使用using关键字来澄清二义性。使用using关键字可以指定使用哪个基类的成员。

    在给定的代码中,using关键字被正确地使用在DerivedDerived2类中,但是在主函数中没有给出正确的使用方式,导致报错。要解决这个问题,可以做以下修改:

    1. 对于Derived类,在主函数中使用using关键字来指定使用的基类,如p->Base1::var=2;
    2. 对于Derived2类,在主函数中使用using关键字来指定使用的成员函数,如p->Base1::fun();

    以下是修改后的代码:

    #include <iostream>
    using namespace std; 
    
    class Base1{
    public:
        int var;
        void fun(){cout<<"Base1"<<endl;}    
    };
    
    class Base2{
    public:
        int var;
        void fun(){cout<<"Base2"<<endl;}        
    };
    
    class Derived:public Base1,public Base2{
    public:
        using Base1::var;//加using澄清二义性 
        using Base1::fun;//加using澄清二义性 
    };
    
    class Derived2:public Base1,public Base2{
    public:
        using Base1::fun;//加using澄清二义性 
        void fun(int i){cout<<"Derived2"<<endl;}        
    };
    
    int main(){
        Derived d;
        Derived *p=&d;
        
        d.var=1;//请求不明确(二义性)
        d.fun(); //请求不明确(二义性)
        
        d.Base1::var=2;
        d.Base1::fun();
        
        p->Base2::var=2;
        p->Base2::fun();
        
        return 1;
    }
    

    运行修改后的代码,输出将会是:

    Base1
    Base2
    

    注意:在多继承中,使用using关键字来澄清二义性需要谨慎使用,因为每个基类都有可能定义相同的成员和成员函数,使用不当可能导致意外的结果。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP