2016-10-25 153 views
1

假設我有一個基類A和三個從A派生的類,稱爲類x,y,z。現在,類x有一個函數成員f,我想通過多態性從類A指針訪問。如何在存在多個派生類時使用基類指針訪問派生類的函數成員?

我知道我還必須定義類A中的相應虛函數,否則,我會得到類似"class A has no member named f"的錯誤。但是,如果我在A中定義了虛函數,我還需要在yz中定義f,否則會提出錯誤說明"y and z are of abstract class type"。但有時,f就像是一個特徵函數,只與x類有關,並且在類yz中定義是沒有意義的,儘管我可以在yz中沒有給出任何內容。

我的問題是在上面的情況,我該怎麼辦?

+2

重新設計您的類層次結構,以便只調用'f'的代碼只獲取引用或指向'x'的指針,而不是'A'。 –

+2

爲什麼不使f非純虛擬,並給予基類的默認實現。並有f()只與x有關,而不是在y和z是暗示遺傳不良 –

+0

@LorenceHernandez我想知道爲什麼你認爲* f()只與x有關,而不是y和z是不良繼承的提示*。孩子班有其父母班沒有的某些功能,其他的孩子班是不是也很自然和普遍?謝謝 – Nicholas

回答

3

從我所看到的,你有3個選項:

  1. 重新設計,因爲你的對象是不正確的。
  2. 執行一個基本函數,該函數聲明並然後拋出
  3. 測試dynamic_cast的結果<> - 然後如果返回null則失敗。
1

但是,如果我定義A中的虛擬函數,我還需要在y和z定義女,否則,一個錯誤說,「y和z是抽象類類型」被升高。

這是不正確的。如果你在一個基類A中定義了一個虛擬函數,那麼你應該編譯你是否在你的派生類中重寫這個函數,除非你明確地使這個虛函數是純粹的..

如果這個基本虛函數不是純粹的,如果你沒有在這些類中覆蓋它,它將被默認調用對象y或z,這可以解決你的問題。

否則,我會避免向下投射。如果您的虛擬功能有問題,因爲您的驅動類具有太多獨特的公共接口,那麼這不是IS-A關係,是時候審查您的設計了。例如,對於共享功能,考慮組合,而不是繼承...

相關問題