2010-07-14 55 views
24

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

+4

你会从私人析构函数派生类的一些问题=) – SadSido 2010-07-14 13:53:13

+0

Duplicate为http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private ? – SadSido 2010-07-14 14:00:46

+1

类似的问题在这里:http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan 2010-07-14 14:00:58

回答

12

here:

采取了构造函数/析构函数声明为private,那么类不能被实例化。

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

+4

公共类A {私人A(){}公共A getA(){返回新的A(); }} 不完全如此。 – 2010-07-14 13:57:38

+2

这不是事实。具有私有析构函数的对象*可以被实例化(例如,在朋友函数内的堆栈中)。 – SadSido 2010-07-14 13:59:08

+2

权利不能堆栈分配,但可以堆分配,也可以从朋友功能... – 2010-07-14 13:59:27

22

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

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

实际上它是用来以允许通过指针任何 其他多态性使用衍生 类来的基础上,但不 允许用户使用这种 指针进行删除。示例: - 抽象基类/接口。

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

6

下面的代码段将会导致编译器错误(VC2010): C2248:“碱基::〜基地”:不能访问在类“基地”声明

class base 
{ 
    ~base(){} 
}; 

class derived : public base 
{ 
}; 

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

    delete d; 
} 

然而私有成员,如果你改变基础析构函数来保护,一切正常。

+0

但即使将其更改为“protected”,也不能通过基类指针销毁对象。 (在这种情况下,它也应该是'虚拟的',顺便说一句)。这有些挫败了派生的许多目的...... – sbi 2010-07-14 15:22:36

6

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

+0

那么我的班级如何被破坏? – doron 2010-07-14 14:38:58

+0

@ deus-ex-machina399:它不能。因此你不能从中得出结论。你不能创建它的自动对象。动态对象永远不能被删除(除非你提供了这样做的成员函数)。 – sbi 2010-07-14 15:20:06

相关问题