weixin_28722211 2021-12-16 15:22 采纳率: 50%
浏览 156
已结题

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

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

  • 写回答

3条回答 默认 最新

  • 真相重于对错 2021-12-16 16:19
    关注

    看一下汇编就清楚,当把一个函数设为虚函数,这个函数的地址就会在这个类的虚函数表上,当你通过父类的指针或引用指向一个子类的实例,通过这个指针调用这个类的一个虚函数时其实是调用了子类的函数,而不是父类的,因为子类的虚函数的地址替代了父类虚函数的地址。这个是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; //这里将直接调用的是子类的析构函数,而在子类的析构函数调用完毕,编译器插入调用父类析构函数的代码就会起到作用,如你所见

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记