delete删除对象

来源:百度知道 编辑:UC知道 时间:2024/06/20 13:03:28
#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对象了?

按照你写的代码,是能正常删除对象的,你在看C++的时候,要理解一个对称与职责的原则:

只要是系统(编译系统或运行时系统)做的事,系统一定会保证对它进行正确的收尾.程序员只需对自己做的事负责...

是什么意思呢?你看,在你的代码中,无论是int a,还是int b,构造函数只是负责为它们赋初值而已,它们的内存实际上是在定义时由系统负责为你分配的.当你调用new 分配一个由B对象时(先不管它由什么指针指向).系统保证按照你所定义的类结构,首先为基类A进行内存布局,并调用构造函数初始化a.然后为自身扩展的类成员进行内存布局,并初始化b...
当你后来通过delete通过基类指针来删除对象时,系统会按照与它以前进行内存布局相反的顺序,释放a,b占有的内存(这就满足了一个对称和职责的原则)...
当然,由于你的析构是非虚的,所以delete *pa不会调用B的析构函数(这里是默认析构函数)...但要清楚,构造函数和析构函数的作用仅是对程序员自身在堆上直接分配内存有关联,与系统内存布局的默认行为关联不大.这一点在你程序中并不成问题,因为你的类成员中并没有使用new来直接分配内存的代码...
唉,讲得有点烦,不过大体是这样了.

基类的析构函数建意写成虚函数
那么基类指针指向子类对象,再析构的时候
就会按虚函数表来调用析构函数
就会先调用子类的,再调用自己的
你这个基类A没有写虚析构函数
所以如果你的子类有在基类基础上增加的东西,就不能正确删除
当然,你的子类B里面没有任何东西,这样的delete是可以正确删除B的

你可以在A,B类中增加析构函数,并且在函数中加上输出语句,就可以判断delete是否调用了B的析构函数了.我试过了,调用的是A的析构函数.如楼上所说,实际应用中,请把基类的析构函数写成虚函数.