为什么我们不能创建抽象类的实例?

Vij*_*jay 10 c++ oop abstract-class language-design

我在很多地方发现:

  • Abstract Class是一个应该用作基类的类.
  • 抽象类是具有至少一个纯虚函数的类.

但有一件事总是让我想到的是为什么我们不能创建一个抽象类的实例?互联网上的许多地方都说创建一个实例是没有意义的,或者有人说它们应该被用作基类.但是为什么创建抽象类的实例会出错呢?

Jer*_*fin 15

void bar()=0;无效 - =0符号只能用于虚拟功能.

抽象类的重点是它是抽象的 - 你已经定义了一个接口而不是一个实现.如果没有实现,实例化类将不会产生有意义或有用的结果.如果确实/有意义地实例化该类的对象,那么您根本不想首先使用抽象类.

例如,考虑设备驱动程序.我们可能有一个抽象存储设备的驱动程序.我们为该设备定义了一些功能,例如读取和写入数据.该抽象类为任何想要读/写数据的代码提供了使用从该抽象类派生的具体类的能力.

我们不能只是实例化我们的抽象存储设备.相反,我们需要一个具体的对象,如拇指驱动器,磁盘驱动器等,以实际读取/写入.需要具体类,因为我们需要特定于实际设备的代码来执行我们在抽象基础中定义的命令.我们抽象存储类只是有一个读或写,但这样做的读取或写入,我们需要为特定设备的驱动程序.有人可能知道如何与SATA硬盘驱动器通信,而另一个人知道如何与USB拇指驱动器通信,而第三个人知道如何读取或写入SD卡.但是,我们不能只说"我要创建一个抽象存储设备",并且在没有定义将"写入"命令转换为(例如)通过SATA的正确信号的实际代码的情况下与之交谈. ,USB,Firewire等,将数据传输到真正的驱动器上.

因此,尝试实例化我们的抽象类是没有意义的,并且是不允许的.我们只使用抽象基类,因此系统的其余部分可以统一处理所有设备.其余代码并不关心信号是如何彼此不同的 - 它只是看到一堆磁盘驱动器,并且可以与所有这些驱动器一起工作,即使通过USB读取数据的细节与读取完全不同在Firewire上(例如).


Fre*_*son 11

抽象类表示不足以实例化的特定内容.例如,如果有人要求您创建车辆怎么办?你不得不问,"什么样的车?" 你不知道是要制造汽车,雪橇还是航天飞机.没有"车辆"这样的对象.然而,"车辆"是一种有用的抽象,可用于对对象进行分组,指出它们之间的共同行为.这就是抽象类的用途.