C++中的受保护的与私有的析构函数是否有区别?如果基类析构函数是私有的,我想象它在删除派生类对象时仍然被调用。受保护的与私有的析构函数
回答
采取了构造函数/析构函数声明为private,那么类不能被实例化。
这是真的,但它可以通过类中的其他方法实例化。同样,如果析构函数是private
,那么该对象也只能从类内部删除。此外,它阻止了类的继承(或者至少阻止继承类被实例化/销毁)。
公共类A {私人A(){}公共A getA(){返回新的A(); }} 不完全如此。 – 2010-07-14 13:57:38
这不是事实。具有私有析构函数的对象*可以被实例化(例如,在朋友函数内的堆栈中)。 – SadSido 2010-07-14 13:59:08
权利不能堆栈分配,但可以堆分配,也可以从朋友功能... – 2010-07-14 13:59:27
如果基类析构函数为private
或protected
,则不能通过基类指针调用delete
。
使用受保护的析构函数来防止通过基类指针破坏派生对象。它将对分离器的访问限制为派生类。它可以防止类库的自动 (堆栈)对象。
实际上它是用来以允许通过指针任何 其他多态性使用衍生 类来的基础上,但不 允许用户使用这种 指针进行删除。示例: - 抽象基类/接口。
但是一个protected
,non-virtual
析构函数似乎是一个等待发生的错误。假设你不提供一个destroy()
函数,你最终必须公开这个dtor。一旦你这样做了,你就无法进一步控制课程,并且如果有人从你的课堂中进一步派生出来,那么就会冒着使用非虚拟教授多态删除的风险。
下面的代码段将会导致编译器错误(VC2010): C2248:“碱基::〜基地”:不能访问在类“基地”声明
class base
{
~base(){}
};
class derived : public base
{
};
int main()
{
derived* d = new derived;
delete d;
}
然而私有成员,如果你改变基础析构函数来保护,一切正常。
但即使将其更改为“protected”,也不能通过基类指针销毁对象。 (在这种情况下,它也应该是'虚拟的',顺便说一句)。这有些挫败了派生的许多目的...... – sbi 2010-07-14 15:22:36
- 1. 受保护的构造函数与纯虚析构函数
- 2. 有没有用于使受保护的析构函数虚拟?
- 3. 受保护的内部构造函数
- 4. 受保护的抽象基类的构造函数和析构函数?
- 5. 受保护的和私有的方法
- 6. C++调用通用基类的私有/受保护函数
- 7. 接口不能声明私有/受保护的函数
- 8. 序列图中的私有/受保护函数
- 9. boost :: python受保护的析构函数问题
- 10. 使用受保护的析构函数删除对象
- 11. Ruby中的私有/受保护块?
- 12. 保持API调用私有/受保护
- 13. C++结构中的私有和受保护的可用性
- 14. Castle.Windsor:具有空的受保护构造函数的解析类型
- 15. 使用make_shared与受保护的构造函数+抽象接口
- 16. 受保护的构造函数 - 不显示与GetConstructors()
- 17. 使用std :: shared_ptr的一个受保护的构造\析构函数
- 18. 具有受保护构造函数的单例类
- 19. 受保护/私有继承铸造
- 20. C++类(公共,私有和受保护)
- 21. 访问受保护或私有属性
- 22. 有关抽象类与私人,公共和受保护的构造函数的一些问题
- 23. 实现文件中的实例变量 - 私有与受保护
- 24. 需要确保构造函数/析构函数被调用一次。但“错误:析构函数是私有的”
- 25. 私人和受保护的纯虚函数之间是否有区别?
- 26. 确保私有/受保护方法的输入?
- 27. C中的继承树和受保护的构造函数#
- 28. 关于受保护的构造函数的查询
- 29. 使用受保护的构造函数的C++常量实例?
- 30. Scala中的受保护函数
你会从私人析构函数派生类的一些问题=) – SadSido 2010-07-14 13:53:13
Duplicate为http://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private ? – SadSido 2010-07-14 14:00:46
类似的问题在这里:http://stackoverflow.com/questions/224966/private-and-protected-members-c – Jordan 2010-07-14 14:00:58