2015.05.12 C++继承
2015-05-12
774 字
4 分钟

继承和组合是C++中比较重要的代码重用方式

继承与组合#

通常,继承被看做是is-a,组合被看做是has-a 当我们不仅想重用内部实现而且还想重用接口的话,使用继承是最好的。

继承方法#

C++内有三种继承方式:公有继承、私有继承、保护继承

公有继承#

公有继承是把父类的公有和保护成员/函数保持原有状态进行继承

私有继承#

私有继承是把父类的所有公有和保护成员/函数作为私有成员进行继承 使用私有继承时,隐藏了父类的所有成员,能在子类中调用,完成部分功能。但既然已变成了私有,所有指针都不能指向此子类继承的成员,因此如果使用私有继承,在父类中有指针(虚函数)指向,则会提示“不允许对不可访问的基类进行转换” or “不可访问”

保护继承#

保护继承是把父类的所有公有和保护成员/函数作为保护成员进行继承 即:

  publicprotectedprivate
公有继承publicprotected不可见
私有继承privateprivate不可见
保护继承protectedprotected不可见

C++中默认继承方式为private继承

向上类型转换#

C++中允许向上类型转换,也就是,从一个专门的类型转换到一个更一般的类型,也就是从子类转换到父类,所以这样的类型转换也是安全的。对于这个转换唯一可能出现的事情就是它失去它专属的成员,而不是获得。

Thinking in C++ page.356

多父类继承#

子类: 父类1,父类2的形式进行多父类继承 对象的层次结构为,父类1,父类2,子类成员 如果有同名成员/函数,无法直接调用,需要使用父类::成员来使用 二义性适用于任何名字,包括函数名。二义性的产生见名字查找问题。

虚继承/虚基类#

多父类继承时,如果一个子类继承的两个父类是从同一个父类中派生的,则在C++中会被认为成从两个同一个父类派生的,无法在子类中使用这个父类的函数or向上转换到这个父类,因为二义性,编译器并不知道是哪一个父类中的函数,即使他们是从同一个父类中派生的,因此使用virtual关键词来进行虚继承,否则编译器将报错。

Thinking in C++ page 810

名字查找问题#

在同名的两个函数之间进行选择时,编译器将选择占优势的那个函数。如果没有占优势的名字,就会产生二义性。 人懒得要死代码都懒得抄了 多态与继承,有待更新

Reference#

浅谈C++继承方式 揭开私有继承的面纱 Thinking in C++ page 336-361

2015.05.12 C++继承
https://blog.xingoxu.com/2015/05/cpp-inherit/
作者
xingo
发布于
2015-05-12
许可协议
CC BY-NC-SA 4.0