虚析构函数
2009-03-31 10:13
295 查看
一个没有虚析构函数的类意味着不能做为一个基类。如std::string,
std::complex, 和 std::vector 都是这样的。为什么继承一个没有虚析构函数的
类是危险的?当你公有继承创建一个从基类继承的相关类时,指向新类对象中的指
针和引用实际上都指向了起源的对象。因为析构函数不是虚函数,所以当你delete
一个这样的类时,C++就不会调用析构函数链。举个例子说明:
class A
{
public:
~A() // 不是虚函数
{
// ...
}
};
class B: public A //错; A没有虚析构函数
{
public:
~B()
{
// ...
}
};
int main()
{
A * p = new B; //看上去是对的
delete p; //错,B的析构函没有被调用
}
ps:如果删除基类指针,则需要运行基类虚构函数并清除基类的成员,如果对象实际是派生类型的,则没有定义该行为,要保证运行适当的析构函数,基类中的析构函数必须为虚析构函数!
std::complex, 和 std::vector 都是这样的。为什么继承一个没有虚析构函数的
类是危险的?当你公有继承创建一个从基类继承的相关类时,指向新类对象中的指
针和引用实际上都指向了起源的对象。因为析构函数不是虚函数,所以当你delete
一个这样的类时,C++就不会调用析构函数链。举个例子说明:
class A
{
public:
~A() // 不是虚函数
{
// ...
}
};
class B: public A //错; A没有虚析构函数
{
public:
~B()
{
// ...
}
};
int main()
{
A * p = new B; //看上去是对的
delete p; //错,B的析构函没有被调用
}
ps:如果删除基类指针,则需要运行基类虚构函数并清除基类的成员,如果对象实际是派生类型的,则没有定义该行为,要保证运行适当的析构函数,基类中的析构函数必须为虚析构函数!
相关文章推荐
- C++父类,不能缺的虚析构函数
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图 .
- 虚析构函数
- 基类与接口类中的虚析构函数(virtual destructor)
- 虚析构函数
- C++虚函数(5) - 虚析构函数
- 虚析构函数
- c++只在基类中用虚析构函数的原因
- 虚析构函数
- 虚析构函数与多态
- C++学习笔记 -- 虚析构函数与纯虚析构函数
- 构造函数、析构函数、虚析构函数、纯虚析构函数要点总结
- C++虚析构函数的作用
- C++ 虚析构函数
- C++虚析构函数的作用
- 第十三周项目—阅读程序,并运行结果(虚析构函数)
- 第十三周项目—阅读程序,并运行结果(虚析构函数)
- 第十三周上机实践项目:阅读程序,并运行结果(虚析构函数)
- 虚析构函数
- 简单的发布bat 与 基类的虚析构函数