抽象类是什么

定义不能被实例化,但可以用作基类的抽象类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Base
{
virtual int g();
virtual ~Base() {}
};

struct A : Base
{
// OK:声明三个成员虚函数,其中两个是纯虚函数
virtual int f() = 0, g() override = 0, h();

// OK:析构函数也可以是纯虚函数
~A() = 0;

// 错误:函数定义中的纯说明符
virtual int b() = 0 {}
};

解释
抽象类用于表示一般性概念 (例如 Shape、Animal 等) ,它可以用作具体类 (例如 Circle、Dog 等) 的基类。

除了作为从其派生的类的基类子对象之外,不能创建抽象类的对象,且不能声明抽象类类型的非静态数据成员。

抽象类型不能用作形参类型,函数返回类型,或显式转换的类型(注意,这是在函数定义点和函数调用点检查的,因为在函数声明点其形参和返回类型可以是不完整类型)。

可以声明到抽象类的指针或引用。

为什么要有抽象类

  1. 规范子类行为:抽象类可以定义一个标准或接口,强制子类实现特定的方法。这确保了所有子类具有一致的行为。
  2. 代码复用:抽象类可以包含一些通用的实现,这些实现可以被所有子类共享,减少代码重复。
  3. 设计灵活性:抽象类提供了一个框架,使得不同的具体实现可以共享相同的接口。这提高了代码的灵活性和可扩展性。

抽象类解决的问题

  1. 统一接口:抽象类可以定义一个统一的接口,确保所有子类都遵循相同的接口规范,从而使得代码更易于维护和扩展。
  2. 代码重用:通过在抽象类中实现一些通用的功能,可以减少子类的代码量,提高代码的可维护性。
  3. 隔离具体实现:抽象类将接口和实现分离,使得可以在不改变客户端代码的情况下更改具体实现。