我想調用未使用基類指針在基類中定義的派生類函數。但這總是會引起錯誤:無法使用基類指針調用派生類函數
error C2039: ‘derivedFunctionName’ : is not a member of ‘BaseClass’
你知道我該如何解決這個問題嗎?
謝謝,
我想調用未使用基類指針在基類中定義的派生類函數。但這總是會引起錯誤:無法使用基類指針調用派生類函數
error C2039: ‘derivedFunctionName’ : is not a member of ‘BaseClass’
你知道我該如何解決這個問題嗎?
謝謝,
您不能呼叫只出現在通過一個指向基類派生的類的成員;您必須先將它(可能使用dynamic_cast
)轉換爲指向派生類型的指針,否則編譯器不知道該方法是否存在。
它可能是這個樣子:
void someMethod(Base* bp) {
Derived *dp = dynamic_cast<Derived*>(bp);
if (dp != null)
dp->methodInDerivedClass();
}
使用dynamic_cast我如何調用駐留在派生類Ernest Friedman-Hill中的函數..如果你用例子解釋意味着它更容易得到它..謝謝 –
@SujeethDamodharan我添加了一個例子。 –
的一種方法是使函數virtual
在基類,然後在派生類中重寫它。您不必在基類中定義函數(儘管可以),但是如果您不想在基類中提供實現,則可以在基類virtual void foo() = 0;
中使用純虛擬語法。
這會讓你在派生類中重寫它,並通過基類指針在基類中調用它。這被稱爲「多態性」。
如果您確定此時它實際上是派生類指針,那麼您也可以在運行時將它轉換爲派生類型。如果不是,它會崩潰。
是的,我同意..但與我們使用虛擬的關鍵字是否有任何可能的方法來做到這一點?謝謝.. –
是的,正如我在我的答案中指出的那樣,如果您確定它實際上是派生類指針,則可以在運行時將其轉換爲派生類型。 'dynamic_cast'也可以,但是很慢。最後,最好使用好的設計實踐(即多態),而不是去投射路線。鑄造工程,但最終會導致脆弱的代碼和更多的維護。 – edtheprogrammerguy
只要方法是虛擬的,就可以通過指向基類的指針調用派生類成員。這就是多態性的意義所在。
爲了使它起作用,您必須在基類中聲明一個虛擬方法(可能是純虛擬的)並在派生類中重載它。
請注意,您將遇到從基本方法調用派生成員的問題。如果這對你沒有意義,那麼做一些ARM或Meyers的閱讀。
你能告訴我們相關的代碼嗎? – Borgleader
這是一個糟糕的設計,不能少。 –
class Material { public: void foo() { cout <<「Class Material」; } }; 類Unusual_Material:公共材料 { 公共: 空隙fooo() { COUT << 「類Unusual_Material」; } }; int main() { Material strange = Unusual_Material(); strange.foo0(); return 0; } –