如何设置我的类,使其无法从 C++98/C++03 继承?

use*_*993 2 c++ c++03 c++98

B使用 C++98(或 C++03),如何定义类 ( ),使得不能从D派生自 的类 ( )实例化任何对象B

struct B {};
struct D : public B {};
D d; // this should result in a compiler error
Run Code Online (Sandbox Code Playgroud)

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

use*_*993 6

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

“命名构造函数”

定义基类的所有构造函数并private提供命名构造函数(返回该类的对象的方法)。staticpublic

缺点:

  • 使用该类“不太干净” /不太简单。这项工作的目的应该是简化该类的使用。结果需要付出更多的努力来使用此类。

《虚拟继承技巧》

我在这里和 Bjarne Stroustrup那里找到了这个建议。另请参阅他的书“The Design and Evolution of C++”第 11.4.3 节。

应限制继承的类 ( )从辅助类 ( )B继承(必须是继承) 。该辅助类只有私有构造函数。和即将被限制的阶级有关系。由于只能调用 的构造函数,因此无法实例化 的后续继承者。public virtualHfriendBBHB

与“命名构造函数”解决方案相反,可以调用“通常”构造函数。我认为使用该类更直接。

缺点:

  • B通常,由于继承,这会增加内存中对象的大小virtual。看这里
  • 编写这样的类需要付出更多的努力。