C++语法小记---多重继承
多重继承
工程中不建议使用多继承,因为多继承带来的问题比带来的便利多,已被放弃
问题一:多重继承的对象,向上获取指针时,有不同的地址 ----无法解决
问题二:菱形继承问题,导致成员冗余 ----虚继承(各种编译器的实现方式不一致,不具备抑制性)
多重继承产生多个虚函数表,建议使用dynmaic_cast进行类型转换
工程中的用法:单继承 + 多接口
#include <iostream>
#include <string> using namespace std; class Base
{
int mi;
public:
Base(int i) : mi(i)
{
} int getI()
{
return mi;
} bool Equal(Base *p)
{
return (p == this);
}
}; class Interface1
{
public:
virtual void show1() = ;
}; class Interface2
{
public:
virtual void show2() = ;
}; class Derived : public Base, public Interface1, public Interface2
{
int mj;
public:
Derived(int i, int j) : Base(i), mj(j)
{
} int getJ()
{
return mj;
} void show1()
{
cout<<"show1()"<<endl;
} void show2()
{
cout<<"show2()"<<endl;
} }; int main()
{
Derived d(, );
cout<<"d.getI() = "<< d.getI() <<endl;
cout<<"d.getJ() = "<< d.getJ() <<endl; Interface1 *p1 = &d;
Interface2 *p2 = &d;
cout<<"p1 = "<<p1<<endl;
cout<<"p2 = "<<p2<<endl; //同一个对象获得不同地址 //基类中定义equal函数,利用dynamic_cast转型,判断是否是同一个对象
if( d.Equal(dynamic_cast<Base*>(p1)) )
{
cout<<"p1 == &d"<<endl; //输出p1 == &d
} if( d.Equal(dynamic_cast<Base*>(p2)) )
{
cout<<"p2 == &d"<<endl; //输出p2 == &d
} return ;
}
C++语法小记---多重继承的更多相关文章
- Jinja2语法小记
jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...
- C++语法小记---开篇
几句闲话 由于C++的语法非常的复杂,但是实际使用的过程中,经常使用的语法也就那么一些,还有比较多的语法很少被使用,时间一长就容易忘记,因此“C++语法小记”主要是将C++中不经常使用和容易忘记的语法 ...
- WINDOWS Server2008上部署Oracle10g及oracle SQL语法小记
首先安装10G客户端 情况一:一般都会安装到一般报错.因为10G是32BIT客户端.而操作系统是64位的.但是不会影响配置监听程序.自主开发的应用程序依然可以运行. 情况二:报错但是配置完监听程序始终 ...
- CSS语法小记
一.CSS语法结构 语法:选择符{属性:值} 例如:body{font-size:12px;} 参数说明: 1.选择符(Selector):指明这组样式所要针对的对象.可以是一个XHTML标签,例如h ...
- Python 3语法小记(四)字典 dictionary
字典是Python里面一种无序存储结构,存储的是键值对 key - value.关键字应该为不可变类型,如字符串.整数.包含不可变对象的元组. 字典的创建很简单,用 d = {key1 : value ...
- Razor语法小记
1.代码块中,<text>标签用来输出,如: @{ <text>sdfsdf</text> } 输出Html: sdfsdf
- Python 3语法小记(六)条件、循环和assert、pass、del
条件: if 条件: 语句块 elif: 语句块 else: 语句块 elif 表示 else if 这居然是合法的!!!1 < x < 2!!! >> ...
- python3语法小记(二)列表 和 元组
列表(list): 列表就像一个线性容器,但是比C++的 lis t扩展多得多 列表里的元素可以是相同类型,也可以包含各种类型,比如列表里嵌套另一个列表 >>> L1 = [1,2, ...
- Python 3语法小记(九) 异常 Exception
常见异常: Exception 所有异常的基类 AttributeError 特性应用或赋值失败时引发 IOError ...
随机推荐
- 微信小程序-页面跳转与参数传递
QQ讨论群:785071190 微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转. navigator标签跳转 <view class=& ...
- 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析
原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...
- vue学习第一天:v-bind的使用(让属性绑定变量)
v-bind的使用 v-bind: 是vue中,提供用于绑定属性的指令 例: <input type="button" value="按钮" title ...
- SourceTree使用详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)
前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...
- 小师妹学JVM之:JIT中的PrintAssembly
目录 简介 使用PrintAssembly 输出过滤 总结 简介 想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升? 如果你的回 ...
- JavaScript基础有关构造函数、new关键字和this关键字(009)
1. 总是记得用new关键字来执行构造函数.前面提到,可以用构造函数创建JavaScript的对象,这个构造函数在使用的时候需要使用new关键字,但如果忘记写入new关键字,会怎么样?事实上这个函数还 ...
- SpringBoot + MyBatis + MySQL 读写分离实战
1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依靠 ...
- mongodb 3.x以上版本与mongodb 2.x版本语法区别
2.x const MongoClient = require('mongodb').MongoClient; const url = 'mongodb://localhost:27017/test' ...
- C++ 不定参数"..."的使用
#include <iostream> #include <cstdio> #include <cstdarg> #define LEN_MSG_BUFFER 12 ...
- Redis系列(十二):数据结构SortedSet跳跃表中基本操作命令和源码解析
1.SkipList Redis的sortedSet数据结构是有序不重复的(索引为唯一的,数据(score)却可以重复), 跳表是redis的一个核心组件,也同时被广泛地运用到了各种缓存地实现当中,它 ...