希望能解释一下?,不然这么硬记,比如虚函数表等方面
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; //这里将直接调用的是子类的析构函数,而在子类的析构函数调用完毕,编译器插入调用父类析构函数的代码就会起到作用,如你所见本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 6无用