C++:类与对象——详解继承、多继承、虚继承

1. 继承

优点:减少重复的代码

语法class 子类 : 继承方式 父类

子类也称为派生类,父类也称为基类

2. 继承方式

  1. 公共继承:public
  2. 保护继承:protected
  3. 私有继承:private

注意

  • public继承方式使得基类的public成员可以被派生类的对象访问,它可以实现类之间的子类型关系
  • protected继承使得基类的public成员不能被派生类的对象访问,但可以被派生类的派生类访问
  • private继承使得基类的public成员既不能被派生类的对象访问,也不能被派生类的派生类访问
  • 父类中所有非静态成员属性都会被子类继承下去,父类中私有成员属性是被编译器隐藏了,因此是访问不到,但是确实被继承下去了

3. 继承中构造和析构顺序

  • 先执行基类的构造函数,再执行派生类的构造函数
  • 先执行派生类的析构函数,再执行基类的析构函数

4. 继承中同名成员处理方式

若子类与父类出现同名成员,如何通过子类对象访问这些成员:

  • 访问子类同名成员,直接访问即可
  • 访问父类同名成员,需要加父类作用域

注意

  • 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数,加作用域可以访问到父类中同名函数

5. 继承中同名静态成员处理方式

  1. 通过对象访问:静态与非静态成员出现同名,处理方式一致
  2. 通过类名访问

6. 多继承

c++允许一个类继承多个类

语法class 子类 : 继承方式 父类1 , 继承方式 父类2...

注意:多继承可能引发父类中有同名成员出现,需要加作用域加以区分

7. 菱形继承

概念:两个派生类继承同一个基类,又有某个类同时继承两个派生类,这种继承叫做菱形继承或钻石继承;

问题:我们将继承两个派生类的派生类称为孙子类,那么意味着孙子类有两个父类、一个爷爷类,那么问题是:两个父类都继承了爷爷类的数据,当孙子类使用数据时就会产生二义性,孙子继承了两份爷爷类的数据,其实这种数据孙子类只需要一份就可以,如何解决?

解决方案:利用虚继承virtual)可以解决菱形继承的问题

在下面代码中,Animal称为虚基类SheepTuoSheepTuo继承得到的是一个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{};
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值