C++-多重继承的注意点
1, 钻石型多重继承如果不想要底部的类有重复的变量,则需要声明为virtual继承
class File{...};
class InputFile: virtual public File{..};
class OutputFile: virtual public File{....};
class IOFile: public InputFile,
public OutputFile
{...};
2, 多重继承来的成员函数指向一边的指针不能访问另一边的函数
- ///////////////////////////////////////////////////////////////////////////////
- //
- // FileName : multi_inherit.h
- // Version : 0.10 created 2013/11/08 00:00:00
- // Author : Jimmy Han
- // Comment :
- //
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef MULTI_INHERIT_H
- #define MULTI_INHERIT_H
- class base1{
- public:
- void baseFunc();
- private:
- int baseElem;
- };
- class derive1 : public base1 {
- public:
- void derive1Func();
- private:
- int derive1Elem;
- };
- class base2{
- public:
- void baseFunc();
- private:
- int baseElem;
- };
- class derive2 : public derive1, public base2{
- public:
- void derive2Func();
- //to avoid ambigous
- void baseFunc();
- private:
- int derive2Elem;
- };
- #endif
- ///////////////////////////////////////////////////////////////////////////////
- //
- // FileName : multi_inherit.cpp
- // Version : 0.10
- // Author : Ryan Han
- // Date : 2013/07/26 16:50:14
- // Comment :
- //
- ///////////////////////////////////////////////////////////////////////////////
- #include "multi_inherit.h"
- #include <iostream>
- using namespace std;
- void base1::baseFunc() {
- cout << "base1Func was called. " << endl;
- }
- void base2::baseFunc() {
- cout << "base2Func was called. " << endl;
- }
- void derive1::derive1Func() {
- cout << "derive1Func was called. " << endl;
- }
- void derive2::derive2Func() {
- cout << "derive2Func was called. " << endl;
- }
- void derive2::baseFunc() {
- base2::baseFunc();
- }
- ///////////////////////////////////////////////////////////////////////////////
- //
- // FileName : multi_inherit_client.cpp
- // Version : 0.10
- // Author : Ryan Han
- // Date : 2013/07/26 16:50:14
- // Comment :
- // Output :
- // $ ./a
- // $ ./a.exe
- // base2Func was called.
- // derive1Func was called.
- // derive2Func was called.
- // base1Func was called.
- // derive1Func was called.
- ///////////////////////////////////////////////////////////////////////////////
- #include "multi_inherit.h"
- #include <iostream>
- using namespace std;
- int main() {
- derive2 d2;
- //if not embed, this will be ambigous and compile error
- d2.baseFunc();
- //could call both derive1Func and derive2Func
- d2.derive1Func();
- d2.derive2Func();
- derive1* b1 = new derive2;
- //call base1 or derive1 functions, OK
- b1->baseFunc();
- b1->derive1Func();
- //call base2 or derive2 functions, compile error.
- //b1->derive2Func();
- return ;
- }
C++-多重继承的注意点的更多相关文章
- J a v a 的“多重继承”
接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...
- java提高篇(九)-----实现多重继承
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...
- 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类
[源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...
- scala 学习笔记(06) OOP(下)多重继承 及 AOP
一.多继承 上篇trait中,已经看到了其用法十分灵活,可以借此实现类似"多重继承"的效果,语法格式为: class/trait A extends B with C with D ...
- Effective C++ -----条款40:明智而审慎地使用多重继承
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...
- python基础——多重继承
python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...
- python 多重继承
多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承. 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__(self, a) ...
- Java提高篇——Java实现多重继承
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...
- C++多重继承带来的问题
首先上图,咱们看图说话! 橙色表示变量,使用private修饰. 如图,假设Person类的变量name只能通过input方法来输入. 那么继承自Person的Student及Teacher类中s ...
- C++多重继承子类和父类指针转换过程中的一个易错点
这两天有个C++新手问了我一个问题,他的工程当中有一段代码执行不正确,不知道是什么原因.我调了一下,代码如果精简下来,大概是下面这个样子: class IBaseA { public: ; int m ...
随机推荐
- 共享内存 最快IPC 的原因
参考 http://www.360doc.com/content/13/0817/11/7377734_307777806.shtml 我的理解,这里指的是用户进程的用户态空间和内核空间,也就是那个3 ...
- iOS 的 Safari 文件上传功能详解
iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...
- IntelliJ IDEA 学习(六)内存设置
小伙伴们经常会发现,在开发的时候,经常遇到内存被占满,导致异常卡顿,有时候提示内存溢出,这时可以通过设置xmx来改善.不过切记最好不要超过内存的1/4 打开 IDEA 安装目录,看到有一个 bin 目 ...
- haskell读写文件相关(含二进制)
使用System.IO模块 使用函数 openBinaryFile :: FilePath -> IOMode -> IO Handle 打开文件 IOMode为 ReadWriteMod ...
- 图片(img标签)的onerror事件
打开网页时提示 Stack overflow at line: 0.我做了截图如下: 经过分析,发现网页中存在类似如下的代码: <img src="pic.gif" oner ...
- assert的用处
ASSERT函数是用于调试中,也就是说在你的代码中当是Debug的时候它完成对参数的判断,如果是TRUE则什么都不做,如果是FALSE则弹出一个程序中断对话框提示程序出现错误.在Release版本中它 ...
- ajax的详细学习
地址:http://www.cnblogs.com/Garden-blog/archive/2011/03/11/1981778.html
- 能源项目xml文件标签释义--DefaultAdvisorAutoProxyCreator
[Spring]AOP拦截-三种方式实现自动代理 这里的自动代理,我讲的是自动代理bean对象,其实就是在xml中让我们不用配置代理工厂,也就是不用配置class为org.springframewor ...
- robotframework笔记17
执行测试用例 基本用法 机器人框架从命令行执行测试用例,和 最终的结果是,在默认情况下,一个 输出文件 以XML格式和一个HTML 报告 和 日志 . 执行后,可以组合和输出文件 否则 进行后期处理 ...
- JavaScript:闭包
根据MDN上的解释『闭包是指函数有自由独立的变量.换句话说,定义在闭包中的函数可以“记忆”它创建时候的环境.』 闭包有两个主要的作用: 1.访问内部函数的局域变量: 2.将创建的变量永久保存在内存中, ...