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++-多重继承的注意点的更多相关文章

  1. J a v a 的“多重继承”

    接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...

  2. java提高篇(九)-----实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  3. 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

    [源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...

  4. scala 学习笔记(06) OOP(下)多重继承 及 AOP

    一.多继承 上篇trait中,已经看到了其用法十分灵活,可以借此实现类似"多重继承"的效果,语法格式为: class/trait A extends B with C with D ...

  5. Effective C++ -----条款40:明智而审慎地使用多重继承

    多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...

  6. python基础——多重继承

    python基础——多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat ...

  7. python 多重继承

    多重继承 除了从一个父类继承外,Python允许从多个父类继承,称为多重继承. 多重继承的继承链就不是一棵树了,它像这样: class A(object): def __init__(self, a) ...

  8. Java提高篇——Java实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  9. C++多重继承带来的问题

    首先上图,咱们看图说话!   橙色表示变量,使用private修饰. 如图,假设Person类的变量name只能通过input方法来输入. 那么继承自Person的Student及Teacher类中s ...

  10. C++多重继承子类和父类指针转换过程中的一个易错点

    这两天有个C++新手问了我一个问题,他的工程当中有一段代码执行不正确,不知道是什么原因.我调了一下,代码如果精简下来,大概是下面这个样子: class IBaseA { public: ; int m ...

随机推荐

  1. 如何在Mac OSX上安装xgboost

    听说xgboost效果很不错,于是准备学习下,但是发现大多数资料都是在讲如何在windows或linux下安装xgboost,而且照着官方文档也没有正确的安装好多线程的xgboost.最后还是从the ...

  2. rsync同步完整配置

    一.需求: 1.对于分公司访问一些服务器(如工程图纸服务器),如果通过Internet上的VPN访问总是觉得速度慢,毕竟带宽有限,为了解决此问题,可以两地建立同步镜像服务器,分公司可以访问本地的镜像服 ...

  3. 在linux(CentOS-6.7_x86_64)上安装mysql成功记录

    查看linux服务器的yum源设置: [root@hadoop03 yum.repos.d]# cd /etc/yum.repos.d [root@hadoop03 yum.repos.d]# ll ...

  4. hiho1123_好配对

    题目 给定两个序列a和b,每个序列中可能含有重复的数字. 一个配对(i,j)是一个好配对当从第一个序列中选出一个数ai,再从第二个序列中选出一个数bj且满足ai>bj. 给出两个序列,问存在多少 ...

  5. vim 空格和换行的删除和替换

      %s/\s//g %s/\r//g %s/\n//g   把一个很长的一行按空格分为多行 :%s/ +/\r/g简单解释一下:%s :在整个文件范围查找替换/ :分隔符+ :匹配空格,其中“ ”表 ...

  6. icp算法的一些参考资料

    1.综述:迭代最近点算法综述,介绍了svd分解和四元数法,其中 svd法:http://blog.csdn.net/kfqcome/article/details/9358853 四元数法:http: ...

  7. 解决Tomcat: Can't load IA 32-bit .dll on a AMD 64-bit platform问题

    http://201209235316.iteye.com/blog/2063853 http://www.cnblogs.com/liuyp-ken/p/5503822.html

  8. Linux安装多个Python版本

    服务器上的Python版本太老了,需要安装一个新的Python版本,才能跑我的代码.因为环境的需要,但是又不能卸载老的版本,所以安装一个新的,使用软链来进行升级. 使用系统自带的yum,apt-get ...

  9. appium支持中文输入

    Appium 1.3.3以上.java:capabilities增加下面两项:capabilities.setCapability("unicodeKeyboard", " ...

  10. 项目解析- JspLibrary - part3

    CRUD read: String sql = "select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename f ...