![297ebb762277b464d3f85a5fbae0417f.png](https://i-blog.csdnimg.cn/blog_migrate/9ef471bef728578cb653c75c6f0a785b.png)
为什么析构函数要被声明为虚函数?
在代码重用时,如果想要使用父类指针释放子类对象,则必须将父类的析构函数声明为虚函数。虚析构函数的声明语法如下:
virtual ~类名();
C++规定,如果父类析构函数为虚函数,则所有子类的析构函数也都是虚函数。也就是说,可以省略子类析构函数的virtual声明。但是,为了子类代码可读性,一般都会显式的将子类析构函数也使用virtual声明。
例子
(1)类族虚析构函数声明
下面的例子定义了父类Animal及其子类Duck,并定义了继承自Duck的子类BlackDuck。为了代码清晰,三个类的析构函数都被声明为虚函数:
class Animal {
public:
Animal() {};
virtual ~Animal() { printf("Destroy Animal! n"); }
};
class Duck:public Animal {
public:
Duck() {};
~Duck() { printf("Destroy Duck! n"); }
};
class BlackDuck : public Duck{
public:
BlackDuck() {};
virtual ~BlackDuck() { printf("Destroy Black Duck! n"); }
};
(2)对象释放函数
为了便于子类和父类所有对象使用相同的代码进行释放,可以定义通用的释函数。函数的参数可以是父类指针或者引用,而不能是父类对象:
void destroy(Animal *animal) {
delete animal;
}
(3)调用及输出代码
下述代码给出了函数调用过程,及对应的输出结果。输出展示出的另外一点是,子类对象释放时会自动调用所有父类的析构函数。
Animal *animal = new Animal();
Duck *duck = new Duck();
BlackDuck *blackDuck = new BlackDuck();
destroy(animal);
destroy(duck);
destroy(blackDuck);
// 输出:
Destroy Animal!
------------------------
Destroy Duck!
Destroy Animal!
------------------------
Destroy Black Duck!
Destroy Duck!
Destroy Animal!