你覺得這一塊的C++代碼的內容:是使用新OK隱式向下轉換嗎?
Polygon* p;
if(shape=="Rectangle")
p = new Rectangle();
else if(shape=="Triangle")
p = new Triangle();
else
exit(EXIT_FAILURE);
,其中矩形和三角形從基類派生的多邊形。
它背後的想法是,我需要使用派生類中的特定方法,直到程序運行時才知道我需要哪個類。 有沒有更好的方法來做到這一點?它編譯但我不知道是否調用了所選派生類的析構函數,以便正確釋放特定變量。
附屬問題:dynamic_cast操作是否涉及數據複製?
謝謝:)
編輯:
感謝您對所有這些非常有啓發性的答案。
現在讓我們假設方法
bool isIsosceles()
在三角,但不是在矩形實現。
然後調用馬上
p->isIsosceles()
顯然會失敗。
我的第一個想法是,要麼:
聲明和實現在基類多邊形isIsosceles()虛擬方法
virtual bool isIsosceles()
{
cout << "Isosceles means nothing to me." << endl;
exit(EXIT_FAILURE);
}
或在if語句中使用的dynamic_cast的。
這些選項中的任何一個都是很好的做法嗎?
非常感謝
_「有沒有更好的方法做這件事?」是的,使用智能指針而不是用'new()'和'delete'自己進行內存管理。此外,我會建議將此代碼放入指定的工廠類中,這是負責創建正確的類型。 – 2014-09-04 16:01:37
'dynamic_cast'不涉及數據拷貝,但它確實涉及使用運行時間類型信息(RTTI)。它通常被認爲是一個緩慢的操作。 – YoungJohn 2014-09-04 16:14:20