多重繼承中的問題
多重繼承中,士兵類(Soldier)繼承人類(Person),步兵類(Infantry)又繼承士兵類,有三個test函數
void test1(Person p)
{
p.play();
}
void test2(Person &p)
{
p.play();
}
void test3(Person *p)
{
p.play();
}
實例化一個步兵類對象Infantry infantry;
然后調用函數test1(infantry);test2(infantry);test3(&infantry);
結果是這樣的:
Person()
Soldier()
Infantry();
person--play()
jack
~person()
person--play()
jack
person--play()
jack
問題來了,為什么只執行一次Person的析構函數
2018-05-30
因為test1是直接以類對象作為實參,在執行時會產生一個臨時對象,函數執行完后會自動銷毀,所以你看到了~person();但test2和test3是以指針和引用作為函數實參,在執行時不會產生新對象,所以函數執行完不存在釋放,相對于直接以對象作為實參的情況,這兩種效率更高
2016-08-20
根據你的代碼打印的結果,推測你使用的是棧上面創建的對象,所以對象的釋放是在程序運行完成之后,如果想看到這個析構函數,要么使用new創建,然后delete釋放,或者你再創建一個函數,在函數里面去執行main函數中的代碼,在main函數里面調用這個函數,那么在這個函數退出時,你就會看到第二次person的析構函數