08-3 cpp面向对象-继承总结
继承-总结
继承结束了,让我们简单总结一下:
-
继承中的专有名词:
子类又称之为:派生类。
父类又称之为:基类。
-
继承的语法
继承的基本语法:
class 子类名 :继承方式 父类
。其中,继承可以多继承,即同一个子类继承多个父类。多继承语法是:
class 子类 :继承方式 父类1, 继承方式 父类2 ...
。在 c++实际开发环境下不建议使用多继承的方式继承类。
-
继承方式
继承一共有三种方式
- 公共继承(
public
) - 保护继承(
protected
) - 私有继承(
private
)
继承的三种继承方式就是类中成员的三种权限。
- 公共继承(
-
继承方式的区别
- 无论什么方式继承,都无法访问父类中的私有成员(
private
) - 如果父类中,属性的公开权限大于继承方式的公开权限,则会在继承后,会修改公开权限大于继承方式的成员的权限为当前继承方式的权限。
- 公共继承(
public
):无法访问父类的私有属性(private
)。除私有属性外的属性都可以被继承,且不会修改属性的权限。 - 保护继承(
protected
):无法访问父类的私有属性(private
);父类中公共成员(public
)将会被修改成为保护权限(protected
)。 - 私有继承(
private
)无法访问父类的私有属性(private
);父类中所有成员,都会被修改成为私有权限(private
)。
- 公共继承(
- 一个子类继承了父类所有成员,但下列情况除外:
- 父类的构造函数、析构函数和拷贝构造函数。
- 父类的重载运算符。
- 父类的友元函数。
- 无论什么方式继承,都无法访问父类中的私有成员(
-
继承中的对象模型
子类会继承父类所有的非静态成员属性,会占用相应的内存空间,包括私有属性(
private
),但是私有属性(private
)被编译器屏蔽,无法访问。可以使用“开发人员命令提示符”查看单独类的具体成员,语法如下:
cl /d1 reportSingleClassLayout<类名> <cpp源文件>
。 -
继承中构造和析构顺序
继承中,会先调用父类的构造函数,再调用子类的构造函数。析构时,先调用子类的析构函数,再调用父类的析构函数。
符合先构造的后析构的规律。
-
继承同名成员处理方式
子类对象可以直接访问子类同名成员。子类对象加上作用域可以访问到父类中的同名成员(包括同名成员属性和成员函数)。
继承中的同名静态成员的访问和同名成员一样,都是添加作用域来实现访问。由于静态成员的特殊性(所有的类的对象共享一份静态成员,静态成员存储在内存的全局区),所以也可以不创建类的对象直接使用作用域来访问。
-
菱形继承
- 菱形继承是存在着两个派生类(类
B
和类C
)继承同一个基类(类A
),同时存在着另外一个类(类D
)同时继承这两个派生类。 - 菱形继承会出现二义性。我们解决二义性的方式是添加作用域。
- 菱形继承可能会出现多次继承,我们需要使用虚继承(
virtual
)的方式处理。 - 虚继承的原理是:继承一个虚基类指针(
vbptr
),虚基类指针(vbptr
)指向虚继承表(vbtable
),虚继承表(vbtable
)记录数据偏移量,最后找到数据所在的内存空间地址,访问到真实的数据。
- 菱形继承是存在着两个派生类(类
:-)