對(duì)析構(gòu)函數(shù)的疑惑
疑問(wèn)1、有個(gè)問(wèn)題啊老師, 程序在執(zhí)行delete p;這個(gè)語(yǔ)句時(shí),為什么會(huì)根據(jù) p 指針找到相應(yīng)的子類對(duì)象的虛函數(shù)表指針?。?/p>
疑問(wèn)2、 還有一個(gè)問(wèn)題,就是-- 如果基類中沒(méi)有虛函數(shù),為什么使用 delete p; 還是不能調(diào)用指針P 對(duì)應(yīng)子類對(duì)象的析構(gòu)函數(shù)??!
針對(duì)疑問(wèn)2自己試驗(yàn)的代碼如下:
#include?<iostream> using?namespace?std; class?Shape { public: Shape(){?cout?<<?"Shape()\n";} ~Shape()?{?cout?<<?"~Shape()\n";?} int?x; int?y; }; class?Circle?:?public?Shape { public: Circle(){?cout?<<?"Circle()\n";} ~Circle()?{?cout?<<?"~Circle()\n";} }; int?main() { Shape?*p?=?new?Circle; delete?p; p?=?NULL; return?0; }
運(yùn)行結(jié)果如下:
此時(shí),還是沒(méi)有調(diào)用子類Circle 中的析構(gòu)函數(shù)。
這節(jié)課老師講的基類中都有虛函數(shù),而此時(shí)基類中沒(méi)有虛函數(shù),子類中的析構(gòu)函數(shù)還是不能調(diào)用。到這里就有困惑了,還望老師予以解答。。。謝謝您
2018-10-04
你提的問(wèn)題在于,沒(méi)有虛函數(shù)時(shí),指針p指向Shape 類對(duì)象的指針變量,即使讓它指向了Circle,但實(shí)際上p指向的是Circle中從基類繼承的部分,通過(guò)指向基類對(duì)象的指針,只能訪問(wèn)派生類中的基類成員,而不能訪問(wèn)派生類增加的成員,所以只會(huì)執(zhí)行基類的析構(gòu)函數(shù)
2016-08-05
1、虛函數(shù)表不是只存儲(chǔ)虛函數(shù)的地址嗎? 怎莫理解您說(shuō)的 “類對(duì)象的頭部即虛函數(shù)表所在” 這句話。
虛函數(shù)表存放的是虛函數(shù)的地址,虛函數(shù)表指針存放的是虛函數(shù)表的首地址,在內(nèi)存中,子類對(duì)象Circle頭部(即前四個(gè)字節(jié))存放的是虛函數(shù)表指針,父類指針p指向子類Circle,也就是說(shuō)把子類Circle的首地址賦值給p,根據(jù)p就可以找到子類Circle的虛函數(shù)表指針,依次找到虛函數(shù)表,再找到虛函數(shù)。
2、沒(méi)有虛函數(shù),就沒(méi)有虛函數(shù)表,子類對(duì)象Circle頭部(即前四個(gè)字節(jié))就沒(méi)有虛函數(shù)表指針,就沒(méi)法調(diào)用子類對(duì)象Circle的析構(gòu)函數(shù)
2016-03-18
1、虛函數(shù)表位于每個(gè)含虛函數(shù)對(duì)象存儲(chǔ)位置的頭部即對(duì)象指針p指向的位置,雖然p是父類類型的指針,但是賦值時(shí)指向的是子類對(duì)象,也就是子類對(duì)象的頭部即虛函數(shù)表所在
2、這個(gè)現(xiàn)象的出現(xiàn)就是我們要用虛析構(gòu)函數(shù)的原因(不知道如何說(shuō)明==)