#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條經驗 獲得超8個贊
按照你寫的代碼,是能正常刪除對象的,你在看C++的時候,要理解一個對稱與職責的原則:
只要是系統(編譯系統或運行時系統)做的事,系統一定會保證對它進行正確的收尾.程序員只需對自己做的事負責...
是什么意思呢?你看,在你的代碼中,無論是int a,還是int b,構造函數只是負責為它們賦初值而已,它們的內存實際上是在定義時由系統負責為你分配的.當你調用new 分配一個由B對象時(先不管它由什么指針指向).系統保證按照你所定義的類結構,首先為基類A進行內存布局,并調用構造函數初始化a.然后為自身擴展的類成員進行內存布局,并初始化b...
當你后來通過delete通過基類指針來刪除對象時,系統會按照與它以前進行內存布局相反的順序,釋放a,b占有的內存(這就滿足了一個對稱和職責的原則)...
當然,由于你的析構是非虛的,所以delete *pa不會調用B的析構函數(這里是默認析構函數)...但要清楚,構造函數和析構函數的作用僅是對程序員自身在堆上直接分配內存有關聯,與系統內存布局的默認行為關聯不大.這一點在你程序中并不成問題,因為你的類成員中并沒有使用new來直接分配內存的代碼...
- 2 回答
- 0 關注
- 993 瀏覽
添加回答
舉報
0/150
提交
取消