多继承下的“模棱两可”的问题

对于多继承,如果继承的多个类有相同的方法,在调用时会出现错误,例如如下的代码:

#include <iostream>using namespace std;class Lottery
{
public:virtual int draw();
};int Lottery::draw()
{cout << "Lottery draw" << endl;
}class GraphicalObject
{
public:virtual int draw();
};int GraphicalObject::draw()
{cout << "Lottery draw" << endl;
}class LotterySimulation : public Lottery, public GraphicalObject
{
};int main()
{LotterySimulation *pls = new LotterySimulation;pls->draw();pls->Lottery::draw();pls->GraphicalObject::draw();return 0;
}

错误:

E:\ProgramExcise\Code\Test\main.cpp   35   error: request for member `draw' is ambiguous

错误的意思即:draw 具有二义性

通过增加一对新的classes,就可以绕个弯解决这个问题:

#include <iostream>using namespace std;class Lottery
{
public:virtual int draw();
};int Lottery::draw()
{cout << "Lottery draw" << endl;
}class GraphicalObject
{
public:virtual int draw();
};int GraphicalObject::draw()
{cout << "Lottery draw" << endl;
}class AuxLottery : public Lottery
{
public:virtual int lotteryDraw() = 0;virtual int draw() { return lotteryDraw();}
};class AuxGraphicalObject : public GraphicalObject
{
public:virtual int graphicalObjectDraw() = 0;virtual int draw(){ return graphicalObjectDraw();}
};class LotterySimulation : public AuxLottery, public AuxGraphicalObject
{
public:virtual int lotteryDraw();virtual int graphicalObjectDraw();
};int LotterySimulation::lotteryDraw()
{cout << "lottery" << endl;
}int LotterySimulation::graphicalObjectDraw()
{cout << "graphicObjectDraw" << endl;
}int main()
{LotterySimulation *pls = new LotterySimulation();Lottery *pl = pls;GraphicalObject *pgo = pls;pl->draw();pgo->draw();return 0;
}

但是上述这种机制,虽然能够解决掉二义性的问题,但是它无疑增加了很大的随机性。

其次一个二义性产生源于菱形继承的情况,这种情况可以通过虚继承来解决。如下这种继承情况:

A

/      \

B        C

\       /

D

------Andy  @ 2013-06-22

多继承下的“模棱两可”问题相关推荐

  1. 透过汇编另眼看世界之多继承下的虚函数函数调用

    在我的前一篇文章"透过汇编另眼看世界之函数调用"中,我们通过汇编了解了虚函数调用的全部过程.在本文中我将分析多继承的情况下虚函数调用的情况. 首先还是写一些简单的代码作为本文分析的 ...

  2. 807-C++多继承下,派生类对象有几张虚函数表?

    C++多继承下,派生类对象有几张虚函数表? 我们看下面这个示例: #include <iostream> #include <string> #include <type ...

  3. 继承下构造函数的执行顺序

    这里先给出结论,在贴出代码与执行结果~ 一个派生类构造函数的执行顺序如下: 第一步执行:虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数). 第二步执行:基类的构造函数(多个普通基类也按照 ...

  4. C++虚继承下的内存模型(一)

    简单的面向对象,只有单继承或多继承的情况下,内存模型很好理解,编译器实现起来也容易,C++ 的效率和 C 的效率不相上下.一旦和 virtual 关键字扯上关系,使用到虚继承或虚函数,内存模型就变得混 ...

  5. python面向编程:类继承、继承案例、单继承下属性查找、super方法

    一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...

  6. C++工作笔记-多继承下的一个大坑

    当一个类多继承了2个类,如类C,继承了类A和B.创建了很多类C放到list<A*>这种容器中,一个list,保存的是类A的指针. 如果用类A直接转成类B,这个类B是无法得到类C中继承下来的 ...

  7. Java学习笔记类对象多态继承(下)

    面向对象(下) 1.类的继承 一.什么是继承,有什么用? 继承:在现实世界当中也是存在的,例如:父亲很有钱,几子不用努力也很有钱 继承的作用: 基本作用:子类继承父类,代码可以得到复用.(这个不是重要 ...

  8. C++虚继承下的内存模型(二)

    对于虚继承,恰恰和普通继承相反,大部分编译器会把基类成员变量放在派生类成员变量的后面,这样随着继承层级的增加,基类成员变量的偏移就会改变,就得通过其他方案来计算偏移量. 下面我们来一步一步地分析虚继承 ...

  9. 6.继承下的构造函数域析构函数

    实验目的:1.掌握派生类的声明方法和派生类构造函数的定义方法 2.掌握不同方式下,构造函数与析构函数的执行顺序与构造规则 运行结果: 结果很明显:基类的构造函数先运行,派生类的构造函数后运行 结束时, ...

最新文章

  1. 乖乖给行人让路?学界推出无人机控制技术NMPC,可在低空中实现自主导航和避障...
  2. 机器学习(五) 关于散点图生成
  3. 【Android 安装包优化】开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )
  4. 如何把复杂单体应用快速迁移到微服务
  5. python自动点击网页按钮_Python+Selenium使用(二)- 自动点击下一页
  6. linux ubuntu 软件安装的三种方式
  7. 前端学习(1898)vue之电商管理系统电商系统之渲染用户的对话框
  8. 数据:哈佛大学新生近五成是富二代!
  9. java 指针 引用_java中的引用与c中的指针
  10. hr签核系统可以用python做吗_数字与签核参考流程
  11. SAX与DOM之间的区别 转帖
  12. 图解网络(一)——计算机网络基础
  13. docker安装kafka和zookeeper
  14. 3 FPGA时序约束理论篇之IO约束
  15. 使用计算机视觉来做异常检测
  16. PG14新特性--恢复和VACUUM的加速
  17. 【Mysql】utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别
  18. c++语言如何实现水仙花数(小白)
  19. npm 和 cnpm 的区别
  20. win10设置开机启动项_华硕主板如何设置开机第一启动项方法大全

热门文章

  1. 苹果公布 2021 年 App Store 最 佳应用、最 佳游戏
  2. Material-UI 5 即将推出
  3. [C++] OJ造数据程序
  4. 5.SQL数据库存储过程操作
  5. java equals getclass_getClass()和instanceof以及类的equals方法
  6. 用一个例子告诉你 什么是Scala中的隐式转换
  7. jQuery.parseJSON()函数
  8. vue安装webpack时出现npm ERR! JSON.parse Failed to parse json
  9. 远程连接 VirtualBox 虚拟机
  10. Oracle12c instant client和PL/SQL在windows下的安装和使用