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 ...
随机推荐
- Android事件传递机制(转)
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
- 牛客网 --java问答题
http://www.nowcoder.com/ 主要是自己什么都不怎么会.在这里可以学习很多的! 第一天看题自己回答,第二天看牛客网的答案! 1 什么是Java虚拟机?为什么Java被称作是“平台无 ...
- What is the difference between extensibility and scalability?
You open a small fast food center, with a serving capacity of 5-10 people at a time. But you have en ...
- matlab中图像显示函数
image函数是显示图像的最基本的方法.该函数还产生了图像对象的句柄,并允许对对象的属性进行设置. imagesc函数也具有image的功能,所不同的是imagesc函数还自动将输入数据比例化,以全色 ...
- toolbar
toolbar= (Toolbar) findViewById(R.id.toolbar_mainactivity); // 设置主标题及其颜色 toolbar.setTitle("Andr ...
- 销售 >> 当今社会生产力最大的源泉为 >>自助服务 与推销员随之消失
销售可能是变化最大的企业职能.比如,经济学家喜欢提出陷阱问题“什么概念或者想法成为当今社会生产力最大的源泉?” 大多数人回答计算机, 正确的回答是自助服务与推销员随之消失 ...
- 抓包工具Fidder设置(移动端抓包)
1.下载安装fiddler,下载链接:http://fiddler2.com/get-fiddler(我用的是免安装的fiddler2) 2.设置fiddler 打开Fiddler, Tool ...
- 20145218 《Java程序设计》第二周学习总结
Java中的注释格式 单行注释 //注释文字 多行注释 /注释文字/ 文档注释 /**注释文字*/ 注释不仅仅是对代码进行解释,在上一篇博客中也写过,注释也可以用来检查程序中的错误,可以说是一个小窍门 ...
- jq实现多级手风琴效果
/*左侧*/ .wrapper, .main { height: 100%; z-index: 9 } .main { position: relative; } .main_L { width: 2 ...
- python 练习 16
#!/usr/bin/python # -*- coding: UTF-8 -*- import time myD = {1: 'a', 2: 'b'} for key, value in dict. ...