hjk41的日志

Avatar

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() 这就需要一些额外的数据结构,以及额外的判断。所以对要求高效的程序中,对非基类,最好不要将其析构函数声明为虚函数。

另外,如果希望自己写的类只被做为基类,即希望它是一个抽象类,那么我们一般会在这个类中声明一些纯虚函数,这时我们就可以把它的析构函数声明为纯虚函数。

评论已关闭