2013-12-16 49 views
1

我即將絕望!我需要調用從一個指針非虛成員函數,我的基類:從基地調用非虛擬成員函數

class A { }; 

class B : public A { public: void evilFunction() { std::cout << "Yay!"; } }; 

int main(void) { 
    A *pointer = new B(); 

    // Now do something like this: 
    // pointer->evilFunction(); 

    return 0; 
} 

我知道我可以用dynamic_cast的做到這一點 - 但我不允許! 我真的不知道我還能做什麼。理論上,因爲我有指針,我很確定我可以用指針算術做一些魔術來獲得函數的內存位置,然後調用它,但我不知道如何做到這一點或至少如何開始。

任何人誰可以給我一個提示?這就是我需要的。或者我會用我的史詩初學者技能編寫代碼來刪除g ++來報復C++對我造成的痛苦!你不能讓這種事發生,對吧?!

+0

這是虛擬功能的教科書用例。 –

+4

事實上,你可以*不*使用'dynamic_cast'做到這一點。 –

+0

你爲什麼要...... ..? – Sean

回答

7

當您知道指針確實指向B時,則只需使用static_cast即可。


int main() 
{ 
    A *pointer = new B(); 

    // Now do something like this: 
    // pointer->evilFunction(); 
    static_cast<B*>(pointer)->evilFunction(); 
} 
+0

非常感謝你,我認爲這就是它! – chris342423

0

這裏的主要問題,就是爲什麼你不能使用dynamic_cast的。

如果這是因爲您不使用RTTI,並且您仍然可以使用static_cast - 這可能是您的答案。但是,如果這是因爲代碼標準或類似原因,我會想象static_cast或任何「魔術」也將被禁止,因此,您將不得不考慮另一種解決方案(例如,使這個方法虛擬,添加「手動typeid」到基類,並相應地調度(討厭這個......)等)

0

如果不想使用虛擬函數的原因是爲了避免RTTI,你可以實現靜態多態性使用CRTP idiom