2012-07-07 291 views
2

下面是一个面试问题:抽象基类实现

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

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

+1

在这种情况下,你没有向面试官询问* abstract *的含义吗?我想他应该首先避免使用这个术语。 – Nawaz 2012-07-07 17:39:57

+0

这个“抽象基类”的要求是什么? – juanchopanza 2012-07-07 17:52:18

+0

那时我以为不应该创建那个类的成员。 – 2012-07-07 17:54:22

回答

5

您请教两个问题,我们将依次回答:

我们怎样才能实现的抽象基类不使用纯虚函数?

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

我们可以做些什么以使我们不能创建任何类的对象?

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

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

    要做到这一点,应该申报(但没有定义),默认的构造函数和拷贝构造函数的类。如果一个正在使用与C++ 11的删除特殊成员函数支持一个编译器,以删除它们应被宣布。

  2. 在第一个问题的背景下,似乎更有可能是定义一个只能被实例化为另一个类的基类子对象的类。

    这可以通过声明所有构造为受保护的,而不是提供用于创建类的实例,并且通过不成为朋友的任何其他类或功能的任何静态工厂成员函数来完成。

+0

根据L.ppt对Mahesh的回答的评论,受保护的构造函数对于解决方案2来说是不够的,因为任何派生类都可以创建一个基类的独立实例 - 至少,这听起来对我来说是正确的,没有尝试过它或检查标准... – 2012-07-08 03:13:00

+1

@TonyDelroy:不,派生类只能使用其“this”指针访问基类的受保护成员(或者通过形成指向成员的指针,这不适用于此因为不可能获得指向构造函数的指针)。它无法访问任何其他基本类型实例的受保护成员。据我所知,只要所有的构造函数都受到保护,我就没有看到任何漏洞。我很想看到一个(非病态的)例子,证明我错了,但:-) – 2012-07-08 05:20:43