多重继承
  • 工程中不建议使用多继承,因为多继承带来的问题比带来的便利多,已被放弃

  • 问题一:多重继承的对象,向上获取指针时,有不同的地址 ----无法解决

  • 问题二:菱形继承问题,导致成员冗余 ----虚继承(各种编译器的实现方式不一致,不具备抑制性)

  • 多重继承产生多个虚函数表,建议使用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++语法小记---多重继承的更多相关文章

  1. Jinja2语法小记

    jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...

  2. C++语法小记---开篇

    几句闲话 由于C++的语法非常的复杂,但是实际使用的过程中,经常使用的语法也就那么一些,还有比较多的语法很少被使用,时间一长就容易忘记,因此“C++语法小记”主要是将C++中不经常使用和容易忘记的语法 ...

  3. WINDOWS Server2008上部署Oracle10g及oracle SQL语法小记

    首先安装10G客户端 情况一:一般都会安装到一般报错.因为10G是32BIT客户端.而操作系统是64位的.但是不会影响配置监听程序.自主开发的应用程序依然可以运行. 情况二:报错但是配置完监听程序始终 ...

  4. CSS语法小记

    一.CSS语法结构 语法:选择符{属性:值} 例如:body{font-size:12px;} 参数说明: 1.选择符(Selector):指明这组样式所要针对的对象.可以是一个XHTML标签,例如h ...

  5. Python 3语法小记(四)字典 dictionary

    字典是Python里面一种无序存储结构,存储的是键值对 key - value.关键字应该为不可变类型,如字符串.整数.包含不可变对象的元组. 字典的创建很简单,用 d = {key1 : value ...

  6. Razor语法小记

    1.代码块中,<text>标签用来输出,如: @{ <text>sdfsdf</text> } 输出Html: sdfsdf

  7. Python 3语法小记(六)条件、循环和assert、pass、del

    条件: if 条件:     语句块 elif:     语句块 else:     语句块 elif 表示 else if 这居然是合法的!!!1 < x < 2!!! >> ...

  8. python3语法小记(二)列表 和 元组

    列表(list): 列表就像一个线性容器,但是比C++的 lis t扩展多得多 列表里的元素可以是相同类型,也可以包含各种类型,比如列表里嵌套另一个列表 >>> L1 = [1,2, ...

  9. Python 3语法小记(九) 异常 Exception

    常见异常: Exception                        所有异常的基类 AttributeError                 特性应用或赋值失败时引发 IOError  ...

随机推荐

  1. Dubbo面试专题

    Dubbo面试专题 1. 什么是dubbo Dubbo是阿里巴巴SOA服务化治理方案的核心框架,是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 2.  ...

  2. js中.bind()和.call()用法讲解

    var option = { ti : 8, it(){ return this.ti; } } 这里又一个option对象,it()方法里的this指的就是option对象的上下文. console ...

  3. 恕我直言你可能真的不会java第5篇:Stream的状态与并行操作

    一.回顾Stream管道流操作 通过前面章节的学习,我们应该明白了Stream管道流的基本操作.我们来回顾一下: 源操作:可以将数组.集合类.行文本文件转换成管道流Stream进行数据处理 中间操作: ...

  4. 利用synchronized解析死锁的一种形成方式

    代码 import ... public class Test{ private static Object o1=new Object(); private static Object o2=new ...

  5. idea 2018版/2019版的破解

    idea 2019版破解的穿越隧道:https://www.jianshu.com/p/09c9afae9a05 idea 2018版破解的穿越隧道:https://www.jianshu.com/p ...

  6. Java深拷贝和浅拷贝的区别

    浅拷贝 被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象.换言之,浅拷贝 不复制引用对象. 1 class Experience { 2 private String ...

  7. JavaWeb网上图书商城完整项目--day02-4.regist页面提交表单时对所有输入框进行校验

    1.现在我们要将table表中的输入的参数全部提交到后台进行校验,我们提交我们是按照表单的形式提交,所以我们首先需要在table表外面添加一个表单 <%@ page language=" ...

  8. Python表达式与生成式

    Python表达式与生成式 前言 本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作.其中涉及到一些性能问题(微乎其微)可以不做考虑. 三元表达式 三元表达式中有三个重要的 ...

  9. ubuntu18.04安装nodejs最新版、指定版 12.x 14.x

    今天准备在 ubuntu 服务器里面安装 nodejs 版本,ubuntu 18.04 仓库 nodejs 默认是 8.x 版本. 1. 通过 apt 安装 nodejs 在 Ubuntu 18.04 ...

  10. 07 . Prometheus监控Memcached并配置Grafana

    List CentOS7.3 prometheus-2.2.1.linux-amd64.tar.gz redis_exporter-v0.30.0.linux-amd64.tar.gz ` 节点名 I ...