C++之继承和派生
标签:二义性 位置 强制 概念 void 析构函数 覆盖 虚继承 无法
继承
- 继承和派生是相对的,继承指的是子类(派生类)继承父类(基类)。派生指的是父类(基类)传承自己的 "家业"给子类(派生类)
- 三种方式(指的是权限public,protected,private)对继承自基类内容的权限只能小于等于继承方式
- 覆盖问题,子类同名函数或者变量会覆盖父类,不存在重载方式。如果想访问父类的被覆盖内容,需要加 域解析符
- 继承时,变量在内存中按照基类->子类->声明顺序在内存中增长存储
- 产生二义性的时候,要加域解析符
构造函数
- 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许
- 无法继承,构造函数初始化顺序和基类的声明定义顺序有关,和初始化列表的位置无关
- 在子类构造函数初始化时,只能调用直接基类的构造函数,不能调用间接基类的。防止重复初始化
- 执行顺序,先执行基类的,再执行子类
析构函数
- 析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
- 无法继承,与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉
- 执行顺序,先执行子类的,再执行基类的,即后构造的先析构
虚继承
- 为了解决多继承(菱形继承)成员变量存在多分拷贝的问题(会发生二义性以及命名冲突等问题)
- 继承时加上virtual关键字即为虚继承,被虚继承的基类将共享成员(这对被继承的基类没有影响)
- 虚继承在VC中还引入了"虚表"概念,虚表就是一个数组,维护了一些基类的相对于当前对象的地址偏移
- 虚基类的对象成员总是被放在内存模型的最后,有共享特性
转换(对象,指针,引用)
- 子类向父类转换(向上转换)无需额外操作
- 父类向子类强制转换(危险)需要手动操作(dynamic_cast关键字),参考类型截断
C++之继承和派生
标签:二义性 位置 强制 概念 void 析构函数 覆盖 虚继承 无法
原文地址:https://www.cnblogs.com/ming-fei/p/14612842.html
评论