C++:类与对象——详解继承、多继承、虚继承
1. 继承
优点:减少重复的代码
语法:class 子类 : 继承方式 父类
子类也称为派生类,父类也称为基类
2. 继承方式
- 公共继承:
public
- 保护继承:
protected
- 私有继承:
private
注意:
public
继承方式使得基类的public
成员可以被派生类的对象访问,它可以实现类之间的子类型关系protected
继承使得基类的public
成员不能被派生类的对象访问,但可以被派生类的派生类访问private
继承使得基类的public
成员既不能被派生类的对象访问,也不能被派生类的派生类访问- 父类中所有非静态成员属性都会被子类继承下去,父类中私有成员属性是被编译器隐藏了,因此是访问不到,但是确实被继承下去了
3. 继承中构造和析构顺序
- 先执行基类的构造函数,再执行派生类的构造函数
- 先执行派生类的析构函数,再执行基类的析构函数
4. 继承中同名成员处理方式
若子类与父类出现同名成员,如何通过子类对象访问这些成员:
- 访问子类同名成员,直接访问即可
- 访问父类同名成员,需要加父类作用域
注意:
- 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数,加作用域可以访问到父类中同名函数
5. 继承中同名静态成员处理方式
- 通过对象访问:静态与非静态成员出现同名,处理方式一致
- 通过类名访问
6. 多继承
c++允许一个类继承多个类
语法:class 子类 : 继承方式 父类1 , 继承方式 父类2...
注意:多继承可能引发父类中有同名成员出现,需要加作用域加以区分
7. 菱形继承
概念:两个派生类继承同一个基类,又有某个类同时继承两个派生类,这种继承叫做菱形继承或钻石继承;
问题:我们将继承两个派生类的派生类称为孙子类,那么意味着孙子类有两个父类、一个爷爷类,那么问题是:两个父类都继承了爷爷类的数据,当孙子类使用数据时就会产生二义性,孙子继承了两份爷爷类的数据,其实这种数据孙子类只需要一份就可以,如何解决?
解决方案:利用虚继承(virtual
)可以解决菱形继承的问题
在下面代码中,Animal
称为虚基类,SheepTuo
从Sheep
和Tuo
继承得到的是一个m_Age
和两个虚基指针,两个虚基指针通过偏移量找到唯一的数据m_Age
class Animal{
public:int m_Age;
};class Sheep : virtual public Animal{};class Tuo : virtual public Animal{};class SheepTuo : public Sheep, public Tuo{};