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说明符。
我发现了这些可能的解决方案,每个都有缺点:
定义基类的所有构造函数并private提供命名构造函数(返回该类的对象的方法)。staticpublic
缺点:
我在这里和 Bjarne Stroustrup那里找到了这个建议。另请参阅他的书“The Design and Evolution of C++”第 11.4.3 节。
应限制继承的类 ( )从辅助类 ( )B继承(必须是继承) 。该辅助类只有私有构造函数。和即将被限制的阶级有关系。由于只能调用 的构造函数,因此无法实例化 的后续继承者。public virtualHfriendBBHB
与“命名构造函数”解决方案相反,可以调用“通常”构造函数。我认为使用该类更直接。
缺点:
B通常,由于继承,这会增加内存中对象的大小virtual。看这里。