“C++的數組不支持多態”?

“C++的數組不支持多態”?

微博

先是在微博上看到了個微博和雲風的評論,然後我回了“樓主對C的內存管理不瞭解,Java寫多了”。

後來引發了很多人的討論,大量的人又藉機來黑C++,比如:

//@Baidu-ThursdayWang:這不就c++弱爆了的地方嗎,需要記憶太多東西


//@編程浪子張發財:這個跟C關係真不大。不過我得驗證一下,感覺真的不應該是這樣的。如果基類的析構這種情況不能 調用,就太弱了。


//@程序元:現在看來,當初由於毅力不夠而沒有深入糾纏c++語言特性的各種犄角旮旯的坑爹細枝末節,實是幸事。為現在還沉浸於這些詭異特性並樂此不疲的同志們感到憂傷。

然後,也出現了一些亂七八糟的理解:

//@BA5BO: 數組是基於拷貝的,而多態是基於指針的,派生類賦值給基類數組只是拷貝複製了一個基類新對象,當然不需要派生類析構函數


//@編程浪子張發財:我突然理解是怎麼回事了,這種情況下數組中各元素都是等長結構體,類型必須一致,的確沒法多態。這跟C#和java不同。後兩者對於引用類型存放的是對象指針。

看來我必需要寫一篇博客以正視聽了。

因為沒有看到上下文,我就猜測討論的可能會是下面這兩種情況之一:

1) 一個Base*[]的指針數組中,存放了一堆派生類的指針,這樣,你delete [] pBase; 只是把指針數組給刪除了,並沒有刪除指針所指向的對象。這個是最基礎的C的問題。你先得for這個指針數組,把數據裡的對象都delete掉,然後再刪除數組。很明顯,這和C++沒有什麼關係。

2)第二種可能是:Base *pBase = new Derived[n] 這樣的情況。這種情況下,delete[] pBase 明顯不會調用虛析構函數 ,這就是上面雲風回的微博。對此,我覺得如果是這個樣子,這個程序員完全沒有搞懂C語言中的指針和數組是怎麼一回事,也沒有搞清楚, 什麼是對象,什麼是對象的指針和引用,這完全就是C語言沒有學好。


分享到:


相關文章: