构造函数不能为虚函数,析构函数可以为虚函数
2011-10-11 15:36
666 查看
构造函数不能为虚函数,析构函数可以为虚函数
虚函数的调用需要虚表指针,虚表指针是由构造函数建立,指向虚表,所以构造函数不能为虚函数,构造函数的作用为用来实例化类,而虚函数是要求在运行时通过虚表来决定到底是调用哪个实现
析构函数可以为虚函数,而且有时必须为虚函数
析构函数设为虚函数的作用:
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
例:
输出结果为:Delete class B
Delete class A
如果把A 的virtual 去掉:
那就变成了Delete class A
因此析构函数不声明为虚函数容易造成内存泄漏。
虚函数的调用需要虚表指针,虚表指针是由构造函数建立,指向虚表,所以构造函数不能为虚函数,构造函数的作用为用来实例化类,而虚函数是要求在运行时通过虚表来决定到底是调用哪个实现
析构函数可以为虚函数,而且有时必须为虚函数
析构函数设为虚函数的作用:
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
例:
#include "stdafx.h" #include "stdio.h" class A { public: A(); virtual ~A(); }; A::A() { } A::~A() { printf("Delete class AP/n"); } class B : public A { public: B(); ~B(); }; B::B() { } B::~B() { printf("Delete class BP/n"); } int main(int argc, char* argv[]) { A *b=new B; delete b; return 0; }
输出结果为:Delete class B
Delete class A
如果把A 的virtual 去掉:
那就变成了Delete class A
因此析构函数不声明为虚函数容易造成内存泄漏。
相关文章推荐
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数
- 为什么不能把构造函数设为虚函数,却可以把析构函数设为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- C++中,为什么构造函数不能够是虚函数,而析构函数可以是虚函数,而且最好是虚函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数?
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数不能声明为虚函数, 析构函数可以
- 构造函数不能为虚函数,析构函数可为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数不能为虚函数,析构函数能并且应该为虚函数
- 为什么构造函数不能为虚函数,而析构函数可以为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 构造函数不能为虚函数,析构函数要为虚函数
- 构造函数为什么不能为虚函数 & 基类的析构函数为什么要为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以
- 为什么构造函数不能是虚函数而析构函数可以
- 为什么构造函数不能声明为虚函数,析构函数可以