受保护与私人析构函数

dor*_*ron 28 c++

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

Abh*_*hay 28

如果基类析构函数是private或者protected你不能通过delete基类指针调用.

使用受保护的析构函数来防止通过基类指针销毁派生对象.它将对destuctor的访问限制为派生类.它会阻止类库的自动(堆栈)对象.

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

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


Ami*_*hum 19

取自这里:

如果构造函数/析构函数声明为private,则无法实例化该类.

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

  • public class A {private A(){} public a getA(){return new A(); 不完全正确. (4认同)
  • 这不是真的.具有私有析构函数*的对象可以被实例化(例如,在友元函数内的堆栈上). (3认同)
  • 如果析构函数受到保护,情况也是如此,因此这在受保护和私有之间没有区别. (3认同)
  • 遗漏的事实:你可以`new`一个有私有析构函数的类,但你不能`删除'它(在成员函数和友元函数之外). (3认同)
  • 权限不能是堆栈分配但可以堆分配,也可以从朋友功能分配... (2认同)

Nem*_*vic 8

下面这段代码会导致编译错误(VC2010):C2248:'base :: ~base':无法访问类'base'中声明的私有成员

class base
{
    ~base(){}
};

class derived : public base
{
};

int main ()
{
    derived* d = new derived;

    delete d;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 但即使您将其更改为“受保护”,您也无法通过基类指针销毁对象。(在这种情况下,它也应该是“虚拟的”,顺便说一句。)这在某种程度上违背了派生的许多目的...... (2认同)

Omn*_*ous 6

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

  • @ deus-ex-machina399:不能。因此,您不能从中得出。而且您不能创建它的自动对象。动态对象永远不能被删除(除非您提供执行该操作的成员函数)。 (2认同)