C++ 继承

2025 年 8 月 29 日 | 阅读 12 分钟

在 C++ 中,继承是一个过程,其中一个对象自动继承其父对象的所有属性和行为。它允许我们重用、扩展或修改在其他类中定义的属性和行为。

C++ 中,继承另一个类成员的类称为派生类,而其成员被继承的类称为基类。派生类是基类的专用类。

语法

它具有以下语法:

C++ 继承基本示例

让我们举一个例子来说明 C++ 继承。

示例

编译并运行

输出

Animal Sounds
Dog Barks

说明

在此示例中,我们有一个基类 Animal,其中包含一个 eat() 函数。之后,我们有一个 Dog 派生类,它继承自 Animal 并包含其自己的函数 bark()。在 main() 函数中,创建了 Dog 类的对象 dog。最后,dog.eat() 调用从 Animal 继承的函数,dog.bark() 调用 Dog 的自身函数。

C++ 中的继承类类型

C++ Inheritance

C++ 继承主要有两种类。

1) 基类

基类是为其他类提供共同属性和方法的类。它定义了其派生类可以重用或覆盖的属性和行为,并且是进一步类扩展的基础。它充当父类和超类。

语法

它具有以下语法:

2) 派生类

派生类是继承基类属性和行为的类。它可以包含一些新功能或覆盖基类的现有功能。它也被称为子类或次级类。

语法

它具有以下语法:

C++ 继承类示例

让我们举一个例子来说明 C++ 中的继承类。

示例

编译并运行

输出

Derived Class Value: 10
Base Class Value: 15

继承的类型

C++ 中主要有五种继承方式。

  • 单继承
  • 多重继承
  • 多层继承
  • 混合继承
  • 层次继承
C++ Inheritance

在这里,我们将逐一讨论所有类型的继承。

1) C++ 单一继承

在 C++ 中,单一继承定义为派生类仅从一个基类继承的继承。

C++ Inheritance

其中“A”是基类,“B”是派生类。

语法

它具有以下语法:

C++ 单一继承示例

让我们举一个例子来说明 C++ 中的单一继承。

示例

编译并运行

输出

Salary: 65000
Bonus: 5500

说明

在此示例中,我们有一个基类 Account 和派生类 Programmer。之后,该程序展示了 C++ 中的单一继承,Programmer 类继承自单个基类 Account。Programmer 对象 p1 可以直接访问继承的 salary 和其自身的 bonus。

阅读更多:单一继承

2) C++ 多重继承

在 C++ 中,多重继承是一个类可能继承多个基类的属性和行为的过程。在这种继承中,一个类可以继承自多个类。它提供了更大的灵活性和代码重用性,但也增加了代码的复杂性。

C++ Inheritance

语法

它具有以下语法:

C++ 多重继承示例

让我们举一个简单的例子来说明 C++ 中的多重继承。

示例

编译并运行

输出

The value of a is : 10
The value of b is : 20
Addition of a and b is : 30

说明

在此示例中,类 'C' 以公共模式继承两个基类 'A' 和 'B'。类 A 和 B 具有自己的数据成员和函数。之后,类 C 中的 show() 方法检索两个继承的值并将它们相加以进行输出。

阅读更多:多重继承

3) C++ 多层继承

C++ 多层继承是一个概念,其中一个类从派生类派生,从而形成继承链。可以有任意数量的级别。让我们考虑三个类,例如类 A、B 和 C,其中类 A 是基类,类 B 是中间类,类 C 是派生类。它表明一个类继承了另一个类,而另一个类又被另一个类继承。

C++ Inheritance

语法

它具有以下语法。

C++ 多层继承示例

让我们看看 C++ 中多层继承的例子。

示例

编译并运行

输出

Eating...
Barking...
Weeping...

说明

在此示例中,我们演示了 C++ 中的多层继承,其中 BabyDog 类继承自 Dog,而 Dog 类又继承自 Animal。BabyDog 的对象 d1 可以访问所有三个类的成员函数,展示了继承的行为,例如吃、叫和哭。

阅读更多:多层继承

4) C++ 混合继承

在 C++ 中,混合继承是多种继承类型组合的过程。在这种继承中,我们可以将单一继承、多重继承、多层和层次继承的元素包含在类中。

C++ Inheritance

语法

它具有以下语法。

C++ 混合继承示例

让我们举一个简单的例子来说明 C++ 中的混合继承。

示例

编译并运行

输出

Enter the value of 'a' :
10              
Enter the value of 'b' :    
20      
Enter the value of 'c' :   
30  
Multiplication of a, b, c is : 6000

阅读更多:混合继承

5) C++ 层次继承

在 C++ 中,层次继承定义为从单个基类派生多个类的过程。在这种继承中,我们可以将基类中所有在子类中通用的特征包含进来。

C++ Inheritance

语法

它具有以下语法。

C++ 层次继承示例

让我们举一个例子来说明 C++ 中的层次继承。

示例

编译并运行

输出

Enter the length and breadth of a rectangle:
23  
20  
Area of the rectangle is : 460          
Enter the base and height of the triangle:  
2   
5
Area of the triangle is : 5 

说明

在此示例中,我们有从公共基类(Shape)派生的两个派生类(Rectangle 和 Triangle)。基类包含一个用于输入尺寸的成员函数,派生类利用该函数来计算和返回矩形和三角形的面积。

阅读更多:层次继承

继承中的访问说明符

在 C++ 中,访问说明符主要可分为三类。

1) 公有继承

在公有继承中,所有公有基类成员保持公有,而保护成员在派生类中保持保护。它说明了真正的“是-一个”关系。
例如,一辆汽车是一个交通工具。一辆汽车继承了交通工具的基本属性,例如启动和停止。

2) 保护继承

保护继承确保派生类中的公有和保护基类成员都保持保护状态。在派生类外部访问受到限制。
在现实世界的例子中,StudentRecord(StudentRecord)保护内部访问,例如分数,同时允许继承的行为。

3) 私有继承

在私有继承中,基类的所有公有和保护成员在派生类中都成为私有的。当继承的目的是代码重用而不是“是-一个”关系时,会使用它。

继承成员的可访问性

下表显示了 C++ 中继承成员的可访问性。

基类可访问性派生类可访问性
公共私有Protected
私有未继承未继承未继承
ProtectedProtected私有Protected
公共公共私有Protected

C++ 继承的影响

在 C++ 中,继承以不同的方式影响类的不同组件。其中一些影响如下。

1) 静态成员和继承

静态成员与类相关,而不是与特定对象相关。类的所有实例都共享这些成员,并且它们不参与常规的继承。虽然派生类不直接继承静态成员,但仍然可以通过基类的名称或派生类的作用域访问它们。

2) 友元函数和类的继承

友元函数和友元类允许外部访问类的私有和保护成员。它们为紧密关联的交互、调试、运算符重载以及允许特定相关的函数或实用类访问提供了继承的灵活性。

3) 继承中的构造函数和析构函数 (C++)

构造函数和析构函数是 C++ 对象生命周期中的重要组成部分。所有类都包含构造函数和析构函数,无论是程序员显式定义的,还是编译器隐式创建的。

构造函数在继承中的行为

  • 派生类不继承构造函数。
  • 然而,当创建派生类对象时,基类的构造函数会被自动调用。
  • 构造函数执行的顺序始终遵循自上而下的方法。
  • 首先,执行基类构造函数。之后,执行派生类构造函数。
  • 如果基类构造函数接受参数,派生类必须使用初始化列表直接调用它。

析构函数在继承中的行为

  • 析构函数不被继承,并且以与构造顺序相反的顺序调用。
  • 首先执行派生类的析构函数,然后调用基类的析构函数。
  • 这确保在释放基类资源之前先释放派生类的资源。

C++ 析构函数继承示例

现在让我们来看一个 C++ 中析构函数在继承中行为的例子。

示例

编译并运行

输出

Parent class constructor is executed
Child class constructor is executed
Child() class destructor is executed
Parent class destructor is executed

说明

在此示例中,当我们创建一个 Child 类对象时,首先调用 Parent 类构造函数,然后调用 Child 类构造函数。当程序终止时,析构函数按相反的顺序调用:首先是 Child 析构函数,然后是 Parent 析构函数,这表明了继承类的生命周期顺序。

继承中的多态性

在 C++ 继承中,多态性允许我们在派生类中重新定义基类成员函数,这称为函数重写。它是运行时多态性的一个重要特性,其中要执行的函数在运行时而不是编译时确定。

C++ 继承中的多态性示例

现在让我们来看一个 C++ 中继承中多态性的例子。

示例

编译并运行

输出

It is a Derived Function.

说明

在此示例中,Derived 类重新定义了最初在 Base 类中声明的 print() 函数。当在 Derived 类对象 d_object 上调用 print() 函数时,将执行 Derived 类中的重写版本,从而产生输出“It is a Derived Function”。

C++ 继承选择题

1) C++ 中类的默认继承模式是什么?

  1. 公共
  2. 私有
  3. Protected
 

答案:b) 私有


2) 派生类可以直接访问基类的私有成员吗?

  1. 不能
  2. 仅当公有继承时
  3. 仅当基类是友元时
  4. 是的
 

答案:a) 否


3) 公有继承模式是什么?

  1. 拥有关系。
  2. 使用关系。
  3. 拥有一个关系。
  4. 是一个关系。
 

答案:d) 是一个关系。


4) 当发生私有继承时,基类的公有成员会发生什么?

  1. 保持公有
  2. 成为保护
  3. 成为私有
  4. 不继承
 

答案:c) 成为私有。


5) 哪个访问说明符允许基类成员只能在派生类中访问,而在类外部不可访问?

  1. 公共
  2. 私有
  3. 友元
  4. Protected
 

答案:d) 保护