学而时习之:C++中的继承

62 阅读3分钟

C++ 中的继承

继承是面向对象编程(OOP)的核心概念之一。它提供了一种机制,使得一个类可以获取另一个类的特性(字段与方法)。换句话说,继承就是在已有类的基础上创建新类。新类(派生类)可以复用原有类(基类)的字段和方法。

示例:在下面的示例中,Animal 是基类,而 DogCatCow 都是派生类,它们扩展了 Animal 类。

翻译图片并描述结构.png

语法

class 子类 : public 父类
{
    // 新增的字段与方法
};

C++ 继承的工作原理:
在 C++ 中,使用冒号 : 加上访问限定符(如 public)来实现继承。它让派生类(子类)获得基类(父类)的数据成员(字段)和成员函数(方法)。
当一个类继承另一个类时,它会得到父类所有可访问的成员;同时,子类也可以对这些成员进行重新定义(重写)或添加新的功能。

C++ 中继承的类型

1. 单继承

在单继承中,子类仅从一个父类派生,只继承单一父类的属性和行为。有时它也被称为简单继承。

#include <iostream>
using namespace std;
//交通工具
class Vehicle {
public:
    Vehicle() {
        cout << "This is a Vehicle" << endl;
    }
};
//轿车
class Car : public Vehicle {
public:
    Car() {
        cout << "This Vehicle is Car" << endl;
    }
};

int main() {
    Car obj;
    return 0;
}
This is a Vehicle
This Vehicle is Car

2. 多重继承

多重继承是 C++ 的一项特性,它允许一个类同时从多个基类继承。
各基类构造函数的调用顺序与继承顺序相同。例如在下段示例代码中,B 的构造函数先于 A 的构造函数被调用。

语法示例:

class A{
    // ...
};

class B{
    // ...
};

class C : public A, public B{
    // ...
};

3. 多级继承

C++ 中的多级继承是指:一个类从另一个已经派生过的类再派生,从而形成一条继承链。 image.png

#include <iostream>
using namespace std;
​
class Vehicle{
  public:
    Vehicle(){
        cout << "This is a Vehicle" << endl;
    }
};
​// 从 Vehicle 派生的类
class FourWheeler : public Vehicle{
  public:
    FourWheeler()
    {
        cout << "4 Wheeler Vehicles" << endl;
    }
};
​
// 从FourWheeler(四轮车)派生的子类
class Car : public FourWheeler{
  public:
    Car()
    {
        cout << "This 4 Wheeler Vehicle is a Car" << endl;
    }
};
​
int main()
{
    Car obj;
    return 0;
}
This is a Vehicle
4 Wheeler Vehicles
This 4 Wheeler Vehicle is a Car

4. 分层继承

在分层继承中,多个子类共同继承自同一个基类,也就是说,从一个基类派生出多个不同的派生类。
例如:Car(小汽车)和 Bus(公共汽车)都继承自 Vehicle(车辆)。 image.png

5. 混合继承

两种或两种以上的继承方式在同一段程序里组合出现时,就称为混合继承。
例如:某个类既使用了多重继承,又处于一条多级继承链中。

image.png 混合继承在 C++ 中可能引发菱形问题(diamond problem)
当某个派生类同时继承了两个拥有共同基类的类时,就会出现该问题:最终派生类里会包含多份共同基类的成员,从而产生访问歧义——到底用哪一份? image.png

解决办法:使用虚继承(virtual inheritance),让共同基类只保留一份共享副本