#include<iostream>using namespace std;class A {public:A(){}};class B:public A{public:B(){}};int main(){B* pB=new B();A* pA=pB;delete pA;return 0;}请问这个delete能正确删除B对象吗,说明一下,谢谢class A {public:A(){a=0;}int a;};class B:public A{public:B(){b=0;}int b;};若改为这样,是不是delete就不能正常删除B对象了?
2 回答
qq_遁去的一_1
TA贡献1725条经验 获得超7个赞
按照你写的代码,是能正常删除对象的,你在看C++的时候,要理解一个对称与职责的原则:
只要是系统(编译系统或运行时系统)做的事,系统一定会保证对它进行正确的收尾.程序员只需对自己做的事负责...
是什么意思呢?你看,在你的代码中,无论是int a,还是int b,构造函数只是负责为它们赋初值而已,它们的内存实际上是在定义时由系统负责为你分配的.当你调用new 分配一个由B对象时(先不管它由什么指针指向).系统保证按照你所定义的类结构,首先为基类A进行内存布局,并调用构造函数初始化a.然后为自身扩展的类成员进行内存布局,并初始化b...
当你后来通过delete通过基类指针来删除对象时,系统会按照与它以前进行内存布局相反的顺序,释放a,b占有的内存(这就满足了一个对称和职责的原则)...
当然,由于你的析构是非虚的,所以delete *pa不会调用B的析构函数(这里是默认析构函数)...但要清楚,构造函数和析构函数的作用仅是对程序员自身在堆上直接分配内存有关联,与系统内存布局的默认行为关联不大.这一点在你程序中并不成问题,因为你的类成员中并没有使用new来直接分配内存的代码...
- 2 回答
- 0 关注
- 964 浏览
添加回答
举报
0/150
提交
取消