如何设置我的 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
),继承(必须是public
virtual
继承) 来自助手 class (H
)。
该助手 class 只有私有构造函数。
它与待限制的 class B
有 friend
关系。
由于只有 B
可以调用 H
的构造函数,因此无法实例化 B
的更多后继者。
与“命名构造函数”解决方案相比,可以调用“普通”构造函数。
我认为使用 class.
更直接
缺点:
- 通常这会增加内存中
B
对象的大小,因为 virtual
继承。参见 here。
- 需要更多的编程 classes.
使用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
),继承(必须是public
virtual
继承) 来自助手 class (H
)。
该助手 class 只有私有构造函数。
它与待限制的 class B
有 friend
关系。
由于只有 B
可以调用 H
的构造函数,因此无法实例化 B
的更多后继者。
与“命名构造函数”解决方案相比,可以调用“普通”构造函数。 我认为使用 class.
更直接缺点:
- 通常这会增加内存中
B
对象的大小,因为virtual
继承。参见 here。 - 需要更多的编程 classes.