最近,我的一个朋友问我如何在C++中防止类继承。他希望编译失败。
我正在考虑这个问题,找到了3个答案。不知道哪一个是最好的。
1) 私有构造函数
class CBase
{
public:
static CBase* CreateInstance()
{
CBase* b1 = new CBase();
return b1;
}
private:
CBase() { }
CBase(CBase3) { }
CBase& operator=(CBase&) { }
};
2) 使用 CSealed
基类、私有ctor和虚拟继承
class CSealed
{
private:
CSealed() {
}
friend class CBase;
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
3)使用虚拟继承CSealed
基类、受保护的ctor和虚拟继承的虚拟继承
class CSealed
{
protected:
CSealed() {
}
};
class CBase : virtual CSealed
{
public:
CBase() {
}
};
以上所有方法都确保了CBase
类不能被进一步继承。我的问题是:
除非通过病毒继承CSealed
类,否则
PS:
上述程序是在MS C++编译器(Visual Studio)中编译的。参考:http://www.codeguru.com/forum/archive/index.php/t-321146.html
发布于 2012-09-07 21:55:09
从C++11开始,您可以将final关键字添加到类中,例如
class CBase final
{
...
我能看到的想要这样做的主要原因(以及我来寻找这个问题的原因)是将一个类标记为非子类,这样您就可以安全地使用非虚拟析构函数并完全避免使用vtable。
发布于 2010-02-02 21:46:52
你不能阻止继承(在C++11的final
关键字之前)-你只能阻止继承类的实例化。换句话说,没有办法防止:
class A { ... };
class B : public A { ... };
你能做的最好的事情就是防止B类型的对象被实例化。在这种情况下,我建议你采纳kts的建议,记录A(或其他任何东西)不是用于继承的事实,给它一个非虚的析构函数,没有其他的虚函数,然后就到此为止。
发布于 2010-02-02 21:28:36
您正在经历扭曲,以防止进一步的子类化。为什么?记录该类不可扩展的事实,并使dtor成为非虚拟的。本着c的精神,如果有人真的想忽略你想要使用的方式,为什么要阻止他们呢?(我也从来没有看到final
类/方法在java中的意义)。
//Note: this class is not designed to be extended. (Hence the non-virtual dtor)
struct DontExtened
{
DontExtened();
/*NOT VIRTUAL*/
~DontExtened();
...
};
https://stackoverflow.com/questions/2184133
复制相似问题