type
date
status
slug
summary
tags
category
icon
password
网址
8.多重继承与派生类成员标识
单一继承
一个派生类只有一个直接基类的情况称为单一继承(single-inheritance)。
多重继承或多继承
由多个基类共同派生出新的派生类,这样的继承结构被称为多重继承或多继承(multipleinheritance)
菱形继承:
菱形继承是多继承的一种特殊情况。
派生类对象的构造过程。
notion image
数据冗余和二义性
两个身份证号从逻辑上讲应是一回事,但是物理上是分配了不同内存空间,是两个变量。
notion image
对象egs 的内存分布图
notion image
数据冗余和二义性的解决办法: 虚基类: 两个身份证号显然是不合理的。可以把class Person这个共同基类设置为虚基类,这样从不同路径 继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射。 虚基类(virtual base class)定义方式如下: class 派生类名:virtual 访问限定符 基类类名{...}; class 派生类名:访问限定符 virtual 基类类名{...}; virtual 关键字只对紧随其后的基类名起作用:
虚继承中派生类对象的构造过程: 在派生类对象的创建中,首先是虚基类的构造函数并按它们声明的顺序构造。第二批是非虚基类的构造函数按它们声明的顺序调用。第三批是成员对象的构造函数。最后是派生类自己的构造函数被调用
菱形虚拟继承的egs对象的内存分布图:
notion image
物理内存:
notion image
总结: 有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不 建议设计出多继承,不要设计出菱形继承。否则在复杂度及性能上都有问题。