/
...
/
/
八. 类继承
Search
Try Notion
八. 类继承
初始化
由于必须先创建基类成员,且继承类不能访问基类的私有成员,故在成员列表初始化中调用基类构造函数
若无显式调用,则调用默认的构造函数
myinherit::myinherit() : mybase() {...}
Copy
C++
💡
辨析: 同含有对象的成员列表初始化不同,其是采用对象名来进行列表初始化, 而此处则是采用基类类名来成员列表初始化
对析构同理,对象过期时,先析构基类再析构继承类
单向同类引用
基类的指针或者引用可以不显性转换的指向继承类(is a特性)
但是继承类指针或引用不能指向基类(单向)
抽象基类
至少有一个纯虚函数的类称为抽象基类
不能被单独创建
纯虚函数语法 virtual double fun1() = 0 函数原型后加入=0
但是纯虚函数可以有其定义,供继承类不重新定义时使用
多态
同一方法再基类和继承类表现不同(区别于重载)
已重定义的方法,如果想要调用基态的方法,用:: 即可
派生类的隐藏
若重定义则以函数名作为唯一指标来隐藏基类
意味则基类同名重载函数,若继承类多态一个,所有重载均会被隐藏
即要重定义所有的基类重载函数
直接重定义:根据引用变量的或指针的类型,来改变调用的方法
虚函数:根据对象的看法,来改变调用的方法
原理:通过保一个隐藏成员,保存虚函数表→动态联编(有开销→不默认的原因)
若一个方法是虚函数,其继承的同样为虚函数,不论继承类有无加virtual 关键字
虚析构
一定是必须的
原因:考虑一个这样情形继承类被基类引用,若无虚析构,则按基类方式销毁(内存溢出)
protect关键字: 继承类依旧可以访问,但外部不行
私有继承(has a关系)
不加任何限定词默认为私有继承,需要pubic来保证是公有
基类的共有保护成员成为继承类的私有成员
🤔如何访问内部继承的基类对象?
通过将自身强制类型转换为基类
//如 const mybase & myinherit::baseclass() const {return (const string &)*this }
Copy
C++
在私有继承中,不经过显式转换,不会自动将派生类引用或指针赋给基类的引用和指针
多重继承(Multi )
有几个继承类就继承几个基类对象,如上图,inherit有两个base对象
这将使得派生类基类指向发生错误,如base * p = &inherit 会具有二义性
通过强制类型转换解决base * p = level1_1(&inherit)
虚基类
level_1和level_2继承base时引入virtual关键字,派生时只会保存一个base对象
本质上是对virtual关键字的重载,和虚函数无关,避免新引入关键字对过往代码产生了错误?
过往的层层传递的成员列表初始化不起作用
避免level_1,level_2同时传递给base
如果有间接虚基类,则必须显式调用虚基类的构造函数,或者只使用默认构造函数
必须穿透调用: inherit::inherit(): level_1() , level_2() , base(){...}
改变二义性
二义性与访问规则无关,即使在private中,也会导致二义性
非虚基类中,若继承两个同名成员,则一定要使用域解析
虚基类中,派生类则优于直接先祖或间接先祖名称
例如:level_1(虚继承base)中和base中有同名函数 fun1
则inherit中无须限定词,也可使用level_1 中的fun1
别名
旧式typedef
using =,为模板建立别名
template <typename T> using arrtype = std::array<T,12> //则有 arrtype<int> var1 //等价于 std::array<int,12>
Copy
C++