1、首先需要了解父类和子类的内存分布
如下图,B类(子)继承A类(父):
2、其次就是delete删除对象原理
delete就是依据指针指向的内存地址,如何删除内存数据,具体删除多少呢?那就看指针类型了。
如果指针类型为A*,那就删除A类大小的内存。
3、按1、和2中的内容,那么冒出一个问题!
看如下代码:
A* a = new B(); //按上图方式,B继承于A
delete a;
父类指针指向子类对象的情况会怎么删除?
依据上面内容推测,B类中的A对象段的内存将会被删除,而剩余的B自己的数据将不会,这样不是造成内存泄漏了!!!貌似好像是这样。
4、针对这个问题有什么解决方法?
将父类析构函数设置为虚函数,也就是函数前面加“virtual”即可解决此问题。
这样的情况下,delete a会先执行子类的析构函数后,再执行父类的析构函数。
(1) 父类析构函数不虚化,运行情况如下:
A();
B();
~A();
(2) 父类析构函数设为虚函数,运行情况如下:
A();
B();
~B(); //!!! 不同点 !!!
~A();