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

时间:2011-02-27 05:05:19

标签: c++ oop abstract-class language-design

我在很多地方发现:

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

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

7 个答案:

答案 0 :(得分:15)

您的void bar()=0;无效 - =0表示法只能用于虚拟功能。

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

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

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

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

答案 1 :(得分:11)

抽象类表示的东西不够具体,无法实例化。例如,如果有人要求您创建车辆怎么办?你不得不问,“什么样的车?”你不知道是要制造汽车,雪橇还是航天飞机。没有“车辆”这样的对象。然而,“车辆”是一种有用的抽象,可用于对对象进行分组,指出它们之间的共同行为。这就是抽象类的用途。

答案 2 :(得分:4)

抽象类不仅仅是一个接口。它可能有数据成员。它可能具有非纯虚拟成员函数或非虚拟成员函数。即使是纯虚函数也可能有一个主体,提供默认实现。所以这不是物理上不可能实例化抽象类。

重点是纯虚函数是一个虚拟函数,必须被派生类覆盖。这意味着必须定义派生类 ,并且强制它的方法是禁止实例化抽象类。

抽象类的具体程度不足以实例化。不一定是因为它缺少函数的定义,因为它可能不会遗漏它。它不够具体,因为它代表了一个抽象概念,在实例化之前必须使其更具体。

答案 3 :(得分:3)

这是抽象类的重点:实现者必须提供一些细节。

考虑一下:如果你可以直接实例化它,那么将一个类标记为抽象是什么意思呢?然后它与其他任何类别都没有什么不同。

答案 4 :(得分:2)

无法实例化抽象类的原因是:如果执行纯虚函数,您会怎么做?这将是一个严重的错误,最好在编译时捕获它而不是在运行时。

答案 5 :(得分:1)

在抽象类中,没有给出方法定义,只提供了结构。如果我们可以实例化抽象类并调用这些方法,那将是一个巨大的混乱。抽象类用于维护代码的设计模式。

答案 6 :(得分:0)

只有Chuck Norris可以实例化抽象类。

https://api.chucknorris.io/jokes/ye0_hnd3rgq68e_pfvsqqg