68.虚析构函数 in C++
虚函数 + 析构函数 = 虚析构函数
虚析构函数非常非常重要,对于处理多态
💡标记为virtual ,意味着C++知道可能会有一个方法,一个层次结构下的某种重写的方法。因为在普通的方法面前标记为virtual ,那么他就可以被覆写
💡💡💡而析构函数有点不一样,虚析构函数的以上是:不是覆写析构函数,而是在原有的基础上加上一个析构函数,其意义就是:这个类可能会被拓展为子类,可能还有一个析构函数也需要被调用
直接进入例子开门见山看如何操作
class Base
{
public:
Base() {std::cout << "Base Constructor\n";}
~Base() {std::cout << "Base Destructor\n";}
}
class Derived : public Base
{
public:
Derived() {std::cout << "Derived Constructor\n";}
~Derived() {std::cout << "Derived Destructor\n";}
}
int main() {
Base *temp1 = new Base();
delete temp1;
Derived temp2 = new Derived();
delete temp2;
Base *temp3 = new Derived();
delete temp3;
}
为何会如此?因为temp3 被标记成了Base 类的,所以它只会按照Base 类的规则办事,最后也只会调用Base 类的析构函数!!!!
因为系统不知道这个调用的析构函数,可能有另一个析构函数,因为它没有被标记为虚函数。
故此,我们需要虚析构函数
class Base
{
public:
Base() {std::cout << "Base Constructor\n";}
virtual ~Base() {std::cout << "Base Destructor\n";}
}
class Derived : public Base
{
public:
Derived() {std::cout << "Derived Constructor\n";}
~Derived() {std::cout << "Derived Destructor\n";}
}
int main() {
}
虚析构函数是相当重要的。
💡💡💡💡💡如果在写一个要拓展的类或者子类的时候(利用到多态性),只要允许一个类拥有子类,则必须声明其析构函数是虚函数,因为没人能安全拓展这个类,必须要有安全保证
|