2015.05.12 C++继承

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

继承与组合

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

继承方法

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

公有继承

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

私有继承

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

保护继承

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

public protected private
公有继承 public protected 不可见
私有继承 private private 不可见
保护继承 protected protected 不可见

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

微信扫一扫,分享到朋友圈