博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 继承产生的名字冲突问题 (1)
阅读量:4313 次
发布时间:2019-06-06

本文共 1136 字,大约阅读时间需要 3 分钟。

继承产生的名字冲突问题

#include 
using namespace std;class BASE1 {public: void show() { cout << i << "\n"; }protected: int i;};class BASE2 {public: void show() { cout << j << "\n"; }protected: int j;};class DERIVED: public BASE1, public BASE2 {public: void set(int x, int y) { i = x; j = y; }};int main() { DERIVED obj; // 声明一个派生类的对象 obj.set(5, 7); // set()是DERIVED类自身定义的 obj.show(); // 存在二义性问题 return 0;}

    存在二义性问题,因为无法确定调用的是BASE1还是BASE2的show函数。

解决方法:

    (1)使用域作用符消除二义性

int main() {    DERIVED obj;     obj.set(5, 7);    obj.BASE1::show();    obj.BASE2::show();}

    (2)重定义覆盖BASE1、BASE2的show函数

class DERIVED: public BASE1, public BASE2 {public:    void set(int x, int y) {        i = x; j = y;     }    void show() {    cout << i << "\n";     cout << j << "\n";     }};int main() {    DERIVED obj; // 声明一个派生类的对象    obj.set(5, 7); // set()是DERIVED类自身定义的    obj.show(); // 无二义性问题,调用的是DERIVED中新定义的版本    obj.BASE1::show(); // 仍然可调用从BASE1继承下来show()    obj.BASE2::show(); // 仍然可调用从BASE2继承下来show()return}

 

 

转载于:https://www.cnblogs.com/lytEureka/p/3661590.html

你可能感兴趣的文章
Windows Server 2012和2008中使用计划任务定时执行BAT批处理文件 定时备份mysql数据...
查看>>
费马小定理与GCD&LCM
查看>>
P1077 摆花
查看>>
zynq修改ramdisk文件系统
查看>>
C#测量程序运行时间及cpu使用时间
查看>>
并发编程
查看>>
我自己曾经经历的CMMI3认证通过关于软件测试的访谈【转载】
查看>>
C# 操作Excel ——Excel获取数据、时间、图片
查看>>
【Express系列】第3篇——接入mysql
查看>>
js 高亮显示关键字
查看>>
CPU工作原理简图
查看>>
进程互斥于同步
查看>>
小米公布2017二季度手机出货量:环比增长70%
查看>>
IntelliJ Idea 集成svn 和使用[转自网络]
查看>>
VS2013 密钥 – 所有版本
查看>>
缓冲一日
查看>>
apache常用配置文件讲解
查看>>
html设置透明度
查看>>
读写锁详解
查看>>
<taglib>报错
查看>>