最近我被问到以下问题:
您正在编写一个基类,您希望其他人可以从中派生出来供他们个人使用。您希望没有人能够实现您正在编写的Base类(仅限派生类的对象)。 你会如何实现这个课程?
我想到了两个解决方案:
一,正在使基类抽象(通过添加纯虚函数)。
其次,将构造函数放在受保护的部分下,因此外部没有人能够创建它的实例,只能创建派生类。
我的问题是,我的解决方案之间有什么区别(在所有方面你都能想到)?
感谢。
答案 0 :(得分:3)
受保护的构造函数是明智的,但不会阻止该类被实例化:
class Foo
{
protected:
Foo() = default;
public:
static Foo make() { return Foo(); }
};
int main()
{
auto f = Foo::make();
}
另一方面,抽象类永远不能被实例化,这就是你可能想要的。
然而,重要的问题是,您是否确实需要一个多态层次结构,您需要在运行时决定类型并通过基本指针处理异构的对象集合。如果是这样,那么抽象的基础就是它的方式。如果没有,您就不能拥有没有虚函数的抽象类,并且受保护的构造函数(和析构函数)是表示您想要一个不可实现的基础的唯一方法。
答案 1 :(得分:2)
纯虚函数会将虚函数表的开销添加到基类中,如果需要保持对象非常小,这可能会成为一个问题。通过使用受保护的构造函数和/或受保护的析构函数可以避免这种开销。受保护的析构函数有助于通过基类指针来防止意外删除,在没有虚拟析构函数的情况下,该指针会导致未定义的行为。