这是一个采访问题:
如何在不使用纯虚函数的情况下实现抽象基类。 我们可以做什么,以便我们不能创建任何类的对象,因为在这种情况下我们可以说我们的类是抽象基类。
起初我想过使用虚拟析构函数,但由于虚拟关键字,我不确定这个解决方案。你能帮忙吗?
答案 0 :(得分:5)
你问两个问题,我们将依次回答:
如何在不使用纯虚函数的情况下实现抽象基类?
根据抽象类的定义,这是不可能的:“如果一个类至少有一个纯虚函数,那么它就是抽象的”(C ++11§10.4/ 2)。因此,为了是抽象的,类必须声明一个纯虚函数,或者它必须从它派生的另一个类继承一个。
我们可以做什么,以便我们不能创建任何类的对象?
这个问题可以通过多种不同的方式来解释,每种方式都有不同的解决方案。
从字面上看,这个问题要求提供一种不能创建实例的类型。没有定义构造函数的类不能构造。
要完成此任务,应该声明(但不定义)类的默认构造函数和复制构造函数。如果使用支持C ++ 11删除的特殊成员函数的编译器,则应将它们声明为已删除。
在第一个问题的上下文中,似乎更有可能的是定义一个只能被实例化为另一个类的基类子对象的类。
这可以通过将所有构造函数声明为受保护,不提供任何创建类实例的静态工厂成员函数,以及不与任何其他类或函数成为联系来实现。
答案 1 :(得分:0)
虚拟破坏者无法完成所需的工作。您可以执行以下任一操作:
有关更清晰的说明,请参阅Making a class abstract without any pure virtual methods。