2

这是一个面试问题:

我们如何在不使用纯虚函数的情况下实现抽象基类。我们可以做些什么来让我们不能创建一个类的任何对象,因为在这种情况下我们可以说我们的类是一个抽象基类。

起初我想使用虚拟析构函数,但由于 virtual 关键字,我不确定这个解决方案。你能帮忙吗?

4

2 回答 2

5

您提出两个问题,我们将依次回答:

我们如何在不使用纯虚函数的情况下实现抽象基类?

根据抽象类的定义,这是不可能的:“如果一个类至少有一个纯虚函数,那么它就是抽象的”(C++11 §10.4/2)。因此,为了抽象,一个类必须声明一个纯虚函数,或者它必须从它派生的另一个类继承一个纯虚函数。

我们可以做些什么来让我们不能创建一个类的任何对象?

这个问题可以用多种不同的方式来解释,每种方式都有不同的解决方案。

  1. 从字面上看,这个问题要求一种不能创建实例的类型。无法构造没有定义构造函数的类。

    为此,应该为该类声明(但不定义)默认构造函数和复制构造函数。如果使用支持 C++11 的已删除特殊成员函数的编译器,则应将它们声明为已删除。

  2. 在第一个问题的上下文中,似乎更可能的意图是定义一个只能作为另一个类的基类子对象实例化的类。

    这可以通过将所有构造函数声明为受保护,不提供任何创建类实例的静态工厂成员函数,以及不与任何其他类或函数成为朋友来实现。

于 2012-07-07T21:38:38.643 回答
0

虚拟破坏者不会完成所需的工作。您可以执行以下任一操作:

  1. 用定义声明一个纯虚析构函数
  2. 使基类的构造函数受保护。

有关更清晰的解释,请参阅使类抽象而不使用任何纯虚拟方法

于 2012-07-07T21:17:29.723 回答