如何设置我的 class 使其不能从 C++98/C++03 中继承?

How can I set up my class so it can't be inherited from in C++98/C++03?

使用C++98(或C++03),如何定义class(B),使得无法从class实例化任何对象(D) 来自 B.

struct B {};
struct D : public B {};
D d; // this should result in a compiler error

在 C++11(或更新版本)中,可以使用 final 说明符。

我找到了这些可能的解决方案,每个都有缺点:

“命名构造函数”

定义基础classprivate的所有构造函数并提供named constructors(static,public方法其中returns一个对象class).

缺点:

  • 使用 class 是 "not-so-clean" / 不那么直接。努力的目的应该是简化 class 的使用。结果需要更多努力 using 这样的 classes.

“虚拟继承技巧”

我找到了这个建议 here and from Bjarne Stroustrup here。另请参阅他的书“C++ 的设计与演化”第 11.4.3 节。

限制继承的class(B),继承(必须是publicvirtual继承) 来自助手 class (H)。 该助手 class 只有私有构造函数。 它与待限制的 class Bfriend 关系。 由于只有 B 可以调用 H 的构造函数,因此无法实例化 B 的更多后继者。

与“命名构造函数”解决方案相比,可以调用“普通”构造函数。 我认为使用 class.

更直接

缺点:

  • 通常这会增加内存中 B 对象的大小,因为 virtual 继承。参见 here
  • 需要更多的编程 classes.