1

最近有人问我以下问题:

您正在编写一个基类,您希望其他人能够从中派生以供个人使用。您希望没有人能够实例化您正在编写的基类(仅派生类的对象)。你将如何实现这个类?

我想到了两种解决方案:

一,使基类抽象(通过添加纯虚函数)。

其次,将构造函数放在受保护的部分下,这样外部的任何人都无法创建它的实例,只能创建派生类。

我的问题是,我的解决方案(在您能想到的所有方面)有什么区别?

谢谢。

4

2 回答 2

3

受保护的构造函数是明智的,但不会阻止类被实例化:

class Foo
{
protected:
    Foo() = default;
public:
    static Foo make() { return Foo(); }
};

int main()
{
    auto f = Foo::make(); 
}

另一方面,抽象类永远不能被实例化,这正是你可能想要的。

然而,重要的问题是您是否真的需要一个多态层次结构,在这个层次结构中,您需要在运行时决定类型并通过基指针处理异构对象集合。如果是这样,那么抽象的基础就是要走的路。如果没有,你就不能有一个没有虚函数的抽象类,而受保护的构造函数(和析构函数)是唯一表明你想要一个不可实例化的基础的方法。

于 2013-10-30T22:15:33.980 回答
2

纯虚函数将虚函数表的开销添加到您的基类中,如果您需要保持对象非常小,这可能会成为问题。通过使用受保护的构造函数和/或受保护的析构函数可以避免这种开销。受保护的析构函数有助于防止通过基类指针意外删除,在没有虚拟析构函数的情况下,这将导致未定义的行为。

于 2013-10-30T22:20:51.893 回答