C++中虚析构函数的作用
C++中的虚析构函数到底什么时候有用的,什么作用呢。
总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。
两段代码:
#include <iostream> using namespace std; class Base { public: Base(){} ~Base() { cout << "Base Destructor." << endl; } private: int a, b; }; class Derive : public Base { public: Derive() { } ~Derive() { cout << "Derive Destructor." << endl; // release memeory if(pI != NULL) { delete pI; } } private: int *pI; }; int main(void) { { Base *pD = new Derive; delete pD; } int i; cin >> i; return 0; }
运行结果:
这段代码中没有使用虚析构函数,当删除动态申请的对象时,只执行了基类的构造函数,而此时,子类里面是有动态申请的内存的,那么这就早成了内存的泄露。
1 #include <iostream> 2 3 using namespace std; 4 5 class Base 6 { 7 public: 8 Base(){} 9 virtual ~Base() 10 { 11 cout << "Base Destructor." << endl; 12 } 13 private: 14 int a, b; 15 }; 16 17 class Derive : public Base 18 { 19 public: 20 Derive() 21 { 22 pI = new int; 23 } 24 ~Derive() 25 { 26 cout << "Derive Destructor." << endl; 27 // release memeory 28 if(pI != NULL) 29 { 30 delete pI; 31 } 32 } 33 private: 34 int *pI; 35 }; 36 37 int main(void) 38 { 39 { 40 Base *pD = new Derive; 41 delete pD; 42 } 43 int i; 44 cin >> i; 45 46 return 0; 47 }
运行结果:
从运行结果可以看到,这次执行了基类的析构函数,那么就不会造成内存泄露了。
我的疑问:使用基类指针来操作子类对象实现了多态。也就说虚函数和指针组合实现了C++的多态性。但是那是子类函数与基类函数同名实现了重写基类函数。而析构函数又不同名,难道也可以实现重写么?
是不是因为每个类的析构函数只有一个,所以,C++内部对于析构函数做了特殊的处理,实现了所谓的重写。
多态的实现是通过调用函数来实现的,但是delete是操作符,也可以么?也就说操作符操作基类指针,也会根据指针指向的实际对象来调用相应的函数么?