C++ 抽象类

2025 年 6 月 12 日 | 7 分钟阅读

在 C++ 中,抽象类必须至少包含一个纯虚函数。或者,放一个没有定义的函数。抽象类的派生类必须指定纯虚函数,否则子类本身将变成一个抽象类。

C++ 中,抽象类主要用于表达可以派生出更具体类的广义概念。我们不能创建抽象类类型的对象。但是,指针和引用可以用于抽象类类型。在开发抽象类时,至少定义一个纯虚特性。使用纯说明符 (= 0) 语法声明 虚函数

考虑虚函数的例子。尽管类的目标是为形状提供基本功能,但形状类型的元素过于通用,价值不大。因此,形状是抽象类的一个很好的候选。

语法

它具有以下语法:

C++ 抽象类示例

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

示例

编译并运行

输出

Starting engine of BMW...
Most cars use Petrol or Diesel.
Starting engine of Audi...
Most cars use Petrol or Diesel. 

说明

在此示例中,我们演示了抽象类和运行时多态性的概念。之后,抽象基类 Car 包含一个纯虚函数 startEngine() 和一个具体方法 fuelType()。派生类 BMW 和 Audi 重写了 startEngine() 函数以提供特定的实现。在 main() 函数中,使用基类指针动态调用被覆盖的方法,展示了多态性。

C++ 中抽象类的特性

C++ 中抽象类有几个特性。一些特性如下:

  • 虽然不能从头开始创建抽象类类型,但可以创建指向它的指针和引用。
  • 除了常规函数和变量外,抽象类中还可以存在纯虚函数。向上转型是抽象类的主要用途,它允许派生类访问它们的接口。从抽象类派生的类必须实现所有纯虚函数。
  • 我们不能实例化抽象类,因为它至少包含一个纯虚函数,这阻止了它创建抽象类的实例。
  • 抽象类可以有虚方法和具体方法,其中我们需要像在其他普通类中一样定义具体方法,对于虚方法,我们只需要使用关键字“virtual”声明它们,而不需要定义这样的方法。
  • 抽象类只能用作父类,用于创建子类,这些子类进一步用于实现纯虚函数。
  • 抽象类可以有像其他普通类一样的数据成员。唯一的区别是,在抽象类中,我们将数据成员设置为私有或保护,以防止它们被类外部直接访问。

C++ 中抽象类的限制

C++ 中抽象类有几个限制。一些限制如下:

  • 必须至少包含一个纯虚函数: 在 C++ 中,一个类只有当它至少包含一个纯虚函数时才成为抽象类。
  • 可以有构造函数和析构函数: 尽管不能实例化,但抽象类包含 构造函数析构函数,以支持通过派生类进行正确的初始化和清理。
  • 不能实例化: 我们不能直接从 C++ 中的抽象类创建对象。
  • 派生类必须重写所有纯虚函数: 派生类应为所有继承的纯虚函数提供实现。否则,它也变为抽象类,并且无法在 C++ 中实例化。

我们可以创建抽象类的对象吗?

不能,我们不能创建抽象类的对象,因为抽象类不能被实例化。所以,当我们构造一个纯虚函数时,它会在内存中为其保留一些空间,但我们不会放入任何地址,因此编译器不允许我们为其创建对象。因此,我们只能创建抽象类,但不能实例化它。

抽象在日常生活中有多重要?

ATM 机器是日常生活中抽象的另一个例子。然而,我们都使用 ATM 执行取款、转账、生成迷你对账单等任务,但我们无法访问 ATM 的内部数据。数据保护技术(如数据抽象)可以防止未经授权的数据访问。

C++ 中抽象类和接口的区别

C++ 中抽象类和接口之间存在一些差异。一些主要区别如下:

Interface抽象类
接口只能继承自另一个接口。使用 Extended 关键字,抽象类可以强制执行接口并继承自另一个类。
为了实现接口,需要使用 implements 关键字。使用 extends 关键字从抽象类继承。

抽象类示例

让我们再举一个例子来说明 C++ 中的抽象类。

示例

编译并运行

输出

The area of rectangle is: 50
The area of square with side 4 is: 16

说明

在此示例中,我们定义了一个 Shape 类,其中包含计算矩形和正方形面积的函数。之后,我们使用 width() 和 height() 函数设置矩形的尺寸,并使用 areaOfRectangle() 计算其面积。areaOfSquare() 函数将边长作为输入并返回正方形的面积。在 main() 函数中,这两个函数都使用适当的值进行了演示。

C++ 抽象类 MCQ

1) 以下哪个选项关于 C++ 中的抽象类是正确的?

  1. 任何 C++ 类都称为抽象类。
  2. 用作基类且至少包含一个纯虚函数的类称为抽象类。
  3. 用作基类且至少包含一个虚函数的类称为抽象类。
  4. 任何类派生自的类都称为抽象类。
 

答案: b) 用作基类且至少包含一个纯虚函数的类称为抽象类


2) 以下哪个选项关于 C++ 中的抽象类是正确的?

  1. 类中的任何函数都称为纯虚函数。
  2. 在父类中定义的任何虚方法都称为纯虚函数。
  3. 在父类中没有定义的函数称为纯虚函数。
  4. 在父类中声明的任何虚函数都称为纯虚函数。
 

答案: c) 在父类中没有定义的函数称为纯虚函数。


3) 识别 C++ 中定义纯虚函数的正确语法?

  1. virtual return_type f1( ) = 0;
  2. pure virtual return_type f1( );
  3. virtual return_type f1( ) pure;
  4. virtual return_type f1( );
 

答案: a) virtual return_type f1( ) = 0;


4) 以下哪些类可以用于设计父类或基类?

  1. 派生类
  2. 基类/父类
  3. a & b 都不是
  4. 抽象类
 

答案: d) 抽象类


5) 我们在 C++ 中在哪里使用抽象类?

  1. 仅派生类
  2. 仅父类
  3. 虚类
  4. 以上都不是
 

答案: b) 仅父类


下一主题C++ 命名空间