受保护与私人析构函数

时间:2010-07-14 13:50:10

标签: c++

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

4 个答案:

答案 0 :(得分:25)

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

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

  

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

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

答案 1 :(得分:14)

取自here:

  

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

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

答案 2 :(得分:8)

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

class base
{
    ~base(){}
};

class derived : public base
{
};

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

    delete d;
}

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

答案 3 :(得分:6)

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