在C++中,构造函数不能被声明为虚函数,但是析构函数可以被声明为虚函数。只要基类的析构函数被声明为虚函数了,则它的派生类的析构函数,无论是否使用virtual,都将自动被说明为虚函数。
当使用delete运算符和析构函数一起使用时,delete一个对象,则delete隐含对析构函数的调用,如果析构函数不是虚函数,则子类的对象的析构函数将不会被自动调用。
#include <iostream>
class Base
{
private:
int a;
public:
Base(int _a)
{
a = _a;
}
virtual ~Base()
{
a = 0;
}
};
class Derive : public Base
{
private:
char *str;
public:
Derive(int _a, const char *_s):Base(_a)
{
str = new char[strlen(_s) + 1];
strcpy(str, _s);
}
~Derive()
{
delete str;
}
};
int main(int argc, const char * argv[])
{
// insert code here...
Base *p = new Derive(10, "string");
delete p;
return 0;
}