2009-12-12 39 views
1

我只是閱讀邁爾斯「更有效的C++ 35新方法」 - 第33項,他建議 總是要從抽象基類繼承而不是具體的。抽象類和多態使用數組

他聲稱,我不能完全理解的原因之一是,從一個抽象類繼承,多態處理數組(本書中的第3項)不是問題。

有人可以建議這是怎麼回事?

此外,我想聽聽是否永遠不會讓客戶端實例化其他派生類的好東西? (在他的書中邁爾斯是示出具有例如賦值運算符中的問題)的要求

代碼例如:

CLASS BST {....};

CLASS BlanacedBST ::公共BST {....}

空隙printBSTArray(ostream的& S,const的BST陣列[],INT包含numElements) { 對(INT I = 0;我<包含numElements; i ++) { s < < array [i]; } }

BST BSTArray [10]; printBSTArray(BSTArray); //正常工作

BlanacedBST bBSTArray [10]; printBSTArray(bBSTArray); //未定義的行爲(因爲下標操作符根據BST塊大小推進指針)

然後,他加入了避免從另一個concreat class(BST)繼承的concreate class(BlanacedBST)通常避免了這個問題 - 不管怎樣。

+0

當有人建議做任何事情*永遠*或*永遠*你可以放心地忽略其餘。 – 2009-12-12 15:31:02

+0

是的,它總是*安全地忽略其餘;-) – 2009-12-12 15:31:45

+0

我沒有這本書,所以我不能解決你在這方面的具體問題,雖然我熟悉他的建議只有純粹抽象基類。也許你可以粘貼他使用的代碼示例? – Omnifarious 2009-12-12 17:48:41

回答

2

雖然我認爲避免從非抽象類繼承是一個很好的設計指南,應該讓你對你的設計思考三次,但我絕對不認爲它屬於「從不這樣做」的範疇。

我會說由於切片問題,設計爲從其中繼承數據的類應該隱藏它們的賦值運算符。

我認爲有一種方法可以對不經常想到的類進行分類,我認爲這會導致很多混淆。我認爲有些類被設計爲被值使用,而類被設計爲總是被引用使用(意味着通過引用或指針或類似的東西)。

在大多數面向對象的語言中,用戶定義的類只能被引用使用,並且有一個特殊的類可以被值使用。 C++的一大優勢是你可以創建可以按值使用的用戶定義類。這可能會帶來一些巨大的效益。例如,在Java中,您的所有觀點(挑選一個隨機簡單的類)都是堆分配的,並且需要進行垃圾回收,儘管它們基本上只有兩三個雙打,還有一些不錯的「最終」支持功能。

因此,被設計爲供引用使用的類應禁用分配,並應認真考慮禁用複製構造,並要求人們爲此使用「爲此虛擬功能製作副本」。請注意,Java類通常沒有像賦值運算符或標準拷貝構造函數那樣的東西。

設計爲由值使用的類應該通常不具有虛函數,儘管將它們作爲繼承層次結構的一部分可能非常有用。它們仍然可能相當複雜,但是因爲它們可以包含對引用使用的類對象的引用。

如果您需要將引用類作爲值來使用,則應使用句柄/主體設計模式或智能指針。 STL容器都是設計用於值對象,所以這是一個相當普遍的問題。

1

邁爾斯並沒有說你可以創建沒有問題的數組;他說,你嘗試創造它會更困難。當你嘗試初始化它時,編譯器就會抱怨,因爲如果它是抽象的,你就不能創建基類的對象。

+0

但事情並不是試圖創建基礎調用,而是使用基礎調用作爲函數參數,並將派生類作爲參數發送......所以我仍然無法看到如何使用抽象幫助 – Idan 2009-12-12 16:37:35

+0

但是,可以填充指向基類的指針數組。 – 2009-12-12 21:37:51