【问题标题】:Abstract base class implementation抽象基类实现
【发布时间】:2024-04-12 08:10:02
【问题描述】:

这是一个面试问题:

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

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

【问题讨论】:

  • 你没有问面试官在这种情况下abstract的含义吗?我认为他一开始就应该避免使用这个词。
  • 这个“抽象基类”有什么要求?
  • 当时我认为不应创建该类的任何成员。

标签: c++ inheritance abstract-class virtual-functions


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 根据 L.ppt 对 Mahesh 回答的评论,受保护的构造函数对于您的解决方案 2 来说是不够的,因为任何派生类都可以创建基类的独立实例 - 至少,这听起来是对的对我来说,没有尝试过或检查过标准......
  • @TonyDelroy:不,派生类只能使用其this 指针访问基类的受保护成员(或通过形成指向成员的指针,这在这种情况下不适用因为不可能获得指向构造函数的指针)。它不能访问任何其他基类型实例的受保护成员。据我所知,只要 all 的构造函数都受到保护,我就看不到漏洞。我很想看到一个(非病态的)例子证明我错了,虽然:-)
【解决方案2】:

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

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

更清楚的解释请参考Making a class abstract without any pure virtual methods

【讨论】: