防止实例化类

时间:2013-10-30 22:12:47

标签: c++ abstract

最近我被问到以下问题:

您正在编写一个基类,您希望其他人可以从中派生出来供他们个人使用。您希望没有人能够实现您正在编写的Base类(仅限派生类的对象)。 你会如何实现这个课程?

我想到了两个解决方案:

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

其次,将构造函数放在受保护的部分下,因此外部没有人能够创建它的实例,只能创建派生类。

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

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