【发布时间】:2011-07-05 03:10:00
【问题描述】:
我在很多地方发现:
- 抽象类是应该用作基类的类。
- 抽象类是具有至少一个纯虚函数的类。
但我一直在想的一件事是为什么我们不能创建一个抽象类的实例? Internet 上的许多地方都说创建实例没有意义,或者有人说它们应该用作基类。但是为什么创建抽象类的实例会出错呢?
【问题讨论】:
-
如果我让你画一只猫,那么你可以很容易地画一只猫(如果你画得好:)),但是如果我让你画一只猫一只动物,你会画吗?你可以说到底是哪种动物?同样,您可以创建具体类 Cat 的对象,但不能创建抽象类 Animal 的对象。抽象类背后的整个想法是代码可重用性,以便可以在 Animal 类中实现 Cat 类和 Dog 类的共同行为。
-
虽然 C++ 禁止创建抽象类,但您可能想知道 Delphi 不禁止。如果你尝试它,编译器会警告你,但它会编译,并且实例化会运行得很好。甚至有一些简单的方法可以避免警告。不过,调用抽象方法会引发异常。
-
@Rob:有趣的是,Delphi 就是这样工作的。能够实例化一个抽象类有什么特别的优势(即,你曾经使用过它吗)?它是如何在运行时调用构造函数的?
-
@Cody,没有用例。允许它是不能阻止它的要求。 Delphi 允许类引用,其中变量代表类本身,您可以在变量上调用(非实例)方法。存储对抽象类的引用是完全合法的——编译器在赋值时不知道你是否会调用它的抽象方法——所以它不能禁止赋值。您可以调用的方法包括构造函数。由于编译器无法阻止抽象类的间接实例化,因此禁止直接实例化毫无意义。
标签: c++ oop abstract-class language-design