关于虚析构函数
若父类未声明虚析构函数,这时候
父类 obj=new 子类()
delete obj//调用父类的析构,这里是找到子类的虚函数指针然后找到对应的虚函数表里面父类的析构么?
若父类声明了虚析构,这时候
父类 obj=new 子类()
delete obj//调用子类的析构,这里是可以理解找到子类的徐函数指针,再找到虚函数表,在偏移到对应的虚析构
但是反过来理解不了第一条,求解答。
若父类未声明虚析构函数,这时候
父类 obj=new 子类()
delete obj//调用父类的析构,这里是找到子类的虚函数指针然后找到对应的虚函数表里面父类的析构么?
若父类声明了虚析构,这时候
父类 obj=new 子类()
delete obj//调用子类的析构,这里是可以理解找到子类的徐函数指针,再找到虚函数表,在偏移到对应的虚析构
但是反过来理解不了第一条,求解答。
2019-09-10
首先有个前提,就是如果析构函数声明为虚函数,可以依次执行子类和父类的析构函数(这个前提好像没有看到解释,就当做定理吧)
若父类未声明虚析构函数,这时候
父类 *obj=new 子类()
delete obj;
你这里生成的是父类的指针,你在delete父类这个指针的时候当然是只会调用父类的析构函数,肯定无法调用到子类的析构函数啦,因为此时根本就没有提到子类对象。但是按照上面的前提,当你声明析构函数为虚函数的时候,如果子类构造函数中申请了内存,就可以先调用子类析构函数,把这部分内存释放掉
若父类声明了虚析构,这时候
父类 *obj=new 子类()
delete obj;
同理,这里也是删除父类指针,调用的是父类的析构函数,但是因为你声明了虚析构函数,就会先调用子类再调用父类
子类的虚函数表里面怎么会有父类析构函数呢,就只会有子类的析构函数,除非子类没有重写虚析构函数,才会沿用父类的虚析构函数。但是这些跟你问的内容没有关系。原因是上面几行,跟虚函数指针关系不大。
举报