2013-07-07 122 views
4

我想調用未使用基類指針在基類中定義的派生類函數。但這總是會引起錯誤:無法使用基類指針調用派生類函數

error C2039: ‘derivedFunctionName’ : is not a member of ‘BaseClass’ 

你知道我該如何解決這個問題嗎?

謝謝,

+2

你能告訴我們相關的代碼嗎? – Borgleader

+0

這是一個糟糕的設計,不能少。 –

+0

class Material { public: void foo() { cout <<「Class Material」; } }; 類Unusual_Material:公共材料 { 公共: 空隙fooo() { COUT << 「類Unusual_Material」; } }; int main() { Material strange = Unusual_Material(); strange.foo0(); return 0; } –

回答

13

不能呼叫只出現在通過一個指向基類派生的類的成員;您必須先將它(可能使用dynamic_cast)轉換爲指向派生類型的指針,否則編譯器不知道該方法是否存在。

它可能是這個樣子:

void someMethod(Base* bp) { 
    Derived *dp = dynamic_cast<Derived*>(bp); 
    if (dp != null) 
     dp->methodInDerivedClass(); 
} 
+0

使用dynamic_cast我如何調用駐留在派生類Ernest Friedman-Hill中的函數..如果你用例子解釋意味着它更容易得到它..謝謝 –

+0

@SujeethDamodharan我添加了一個例子。 –

4

的一種方法是使函數virtual在基類,然後在派生類中重寫它。您不必在基類中定義函數(儘管可以),但是如果您不想在基類中提供實現,則可以在基類virtual void foo() = 0;中使用純虛擬語法。

這會讓你在派生類中重寫它,並通過基類指針在基類中調用它。這被稱爲「多態性」。

如果您確定此時它實際上是派生類指針,那麼您也可以在運行時將它轉換爲派生類型。如果不是,它會崩潰。

+0

是的,我同意..但與我們使用虛擬的關鍵字是否有任何可能的方法來做到這一點?謝謝.. –

+0

是的,正如我在我的答案中指出的那樣,如果您確定它實際上是派生類指針,則可以在運行時將其轉換爲派生類型。 'dynamic_cast'也可以,但是很慢。最後,最好使用好的設計實踐(即多態),而不是去投射路線。鑄造工程,但最終會導致脆弱的代碼和更多的維護。 – edtheprogrammerguy

2

只要方法是虛擬的,就可以通過指向基類的指針調用派生類成員。這就是多態性的意義所在。

爲了使它起作用,您必須在基類中聲明一個虛擬方法(可能是純虛擬的)並在派生類中重載它。

請注意,您將遇到從基本方法調用派生成員的問題。如果這對你沒有意義,那麼做一些ARM或Meyers的閱讀。

相關問題