Effective C++ 笔记14: 将基类的析构函数声明为虚函数
把成员函数声明为虚函数的主要目的是为了支持多态,比如我们有一个基类 Shape 和一个派生类 Circle ,代码如下:
class Shape{
public:
Shape(){};
virtual ~Shape(){};
virutal void Draw();
};
class Circle: public Shape{
Circle(){};
~virutal ~Circle(){};
virtual void Draw();
};
int main(){
Shape * s=new Circle;
s->Draw();
delete s;
}
这里我们将 Draw 声明为虚函数,这样在执行 s->Draw() 时调用的就会是 Circle::Draw() ,这也正是我们想要的。
同样,把析构函数声明为虚函数也是这个目的,如果我们不把析构函数声明为虚函数,那么执行 delete s 时调用的将是 Shape::~Shape() ,而不会调用 Circle::~Circle() ,也就是说我们对一个 Circle 类调用了其它类的析构函数,结果可想而知了。所以如果我们希望自己写的类可以用来做基类,那么就需要将类的析构函数声明为虚函数。
但是如果我们不希望自己的类被做为基类,那么就不应该将它的析构函数声明为虚函数。虚函数是要花代价的,因为对一个指针 s ,我们得去判断到底调用哪个类的 Draw() 这就需要一些额外的数据结构,以及额外的判断。所以对要求高效的程序中,对非基类,最好不要将其析构函数声明为虚函数。
另外,如果希望自己写的类只被做为基类,即希望它是一个抽象类,那么我们一般会在这个类中声明一些纯虚函数,这时我们就可以把它的析构函数声明为纯虚函数。