为什么基类析构函数设为虚函数后释放时能调用到子类的析构函数?

希望能解释一下?,不然这么硬记,比如虚函数表等方面

看一下汇编就清楚,当把一个函数设为虚函数,这个函数的地址就会在这个类的虚函数表上,当你通过父类的指针或引用指向一个子类的实例,通过这个指针调用这个类的一个虚函数时其实是调用了子类的函数,而不是父类的,因为子类的虚函数的地址替代了父类虚函数的地址。这个是c++多态的基础,大致代码

class Base {
public:
    Base(){}
    ~Base() {
        std::cout << "base des call" << std::endl;
    }
    virtual void test()=0;

};
class Child :public Base {
public:
    Child() {}
    ~Child() {
        std::cout << "child des call" << std::endl;
    }
    void test() override {

    }
};
....
Base* b=new Child;
b->test()//这里调用的child的test

现在再讲第二个技术要点,就是子类的析构函数里,编译器会自动插入调用其父类的析构函数的代码,这个应该很自然的想到,否则不这样,那么删除子类的时候,他的父类将没有机会得到清除。
结合二者,当父类的析构函数是虚拟的,子类的析构函数将替代父类的出现在他的虚表上
Base * b=new Child;
delete b; //这里将直接调用的是子类的析构函数,而在子类的析构函数调用完毕,编译器插入调用父类析构函数的代码就会起到作用,如你所见

这不就是虚函数的作用么,类的多态性的体现,原理知道了作用也不大。
基类指针能根据创建的子类对象,根据虚函数自动调用子类的函数

实例是子类的话调用的是子类的析构函数,基类的实例不会调用子类的析构函数。除非基类的实例指针通过强制类型转换成子类指针后,可以调用子类的析构函数。

析构函数写成虚函数是让子类根据自己的实际情况来释放内存。比如,有的子类中申请了内存,就需要在析构函数中释放申请的内存,有的子类没有申请内存,就不需要再析构函数中释放内存。