受保护的与私有的析构函数

Posted

技术标签:

【中文标题】受保护的与私有的析构函数【英文标题】:Protected vs Private Destructor 【发布时间】:2011-03-15 21:01:29 【问题描述】:

C++ 中受保护的析构函数和私有析构函数有什么区别吗?如果基类析构函数是私有的,我想在删除派生类对象时仍然会调用它。

【问题讨论】:

从带有私有析构函数的类派生时会遇到一些问题 =) 复制***.com/questions/631783/… ? 类似问题:***.com/questions/224966/… 【参考方案1】:

如果基类析构函数是privateprotected,则不能通过基类指针调用delete

使用受保护的析构函数来防止通过基类指针破坏派生对象。它将析构函数的访问限制为派生类。它可以防止自动 (堆栈)类基的对象。

实际上它用于允许任何 派生的其他多态使用 通过指向基的指针类,但不是 允许用户使用这样的删除 指针。示例:- 抽象基类/接口。

但是 protected, non-virtual 析构函数似乎是一个等待发生的错误。假设您不提供 destroy() 函数,您最终必须公开 dtor。一旦您这样做,您就无法进一步控制该类,并且如果有人从您的类进一步派生,您将面临使用非虚拟 dtor 进行多态删除的风险。

【讨论】:

【参考方案2】:

以下代码将导致编译器错误(VC2010): C2248: 'base::~base' : 无法访问在类 'base' 中声明的私有成员

class base

    ~base()
;

class derived : public base

;

int main ()

    derived* d = new derived;

    delete d;

但是,如果您更改要保护的基本析构函数,一切正常。

【讨论】:

但是即使你把它改成protected,你也不能通过基类指针来销毁对象。 (在这种情况下,它也应该是virtual,顺便说一句。)这在某种程度上违背了推导的许多目的......【参考方案3】:

取自here:

如果构造函数/析构函数被声明为私有,则类不能被实例化。

这是真的,但是它可以从类中的另一个方法实例化。同样,如果析构函数是private,那么对象也只能从类内部删除。此外,它还阻止了类被继承(或者至少阻止了继承的类被实例化/销毁)。

【讨论】:

public class A private A() public A getA() return new A(); 不完全正确。 这不是真的。具有私有析构函数的对象可以被实例化,(例如,在友元函数内的堆栈上)。 权利不能堆栈分配,但可以堆分配,也可以来自友​​元函数... 如果析构函数受保护也是如此,所以这并没有区分受保护和私有。 遗漏的事实:您可以new 一个具有私有析构函数的类,但您不能delete 它(在成员函数和友元函数之外)。【参考方案4】:

答案是你的假设是错误的。基类析构函数在私有时不能调用。

【讨论】:

那么我的班级是如何被破坏的呢? @deus-ex-machina399:它不能。因此你不能从中得到。你不能创建它的自动对象。并且动态对象永远不能被删除(除非您提供这样做的成员函数)。

以上是关于受保护的与私有的析构函数的主要内容,如果未能解决你的问题,请参考以下文章

c++与java 的析构函数

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?

Image 类的析构函数和重载 = 运算符

mfc 类的析构函数

C++ 设置基类的析构函数为虚函数

基类的析构函数写成virtual虚析构函数