簡體   English   中英

從庫調用非虛擬成員函數

[英]Calling non-virtual member function from base

我快要死了! 我需要從指向我的基類的指針中調用一個非虛擬成員函數:

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 ++給我帶來的痛苦! 你不能讓這種事情發生,對吧?

當您知道指針確實指向B ,只需使用static_cast


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

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

這里的主要問題是為什么不允許您使用dynamic_cast。

如果這是因為您不使用RTTI,但仍可以使用static_cast-這可能是您的答案。

但是,如果這是由於代碼標准或類似原因引起的,我想也將禁止static_cast或任何“魔術”,因此,您將不得不考慮另一種解決方案(例如,將該方法虛擬化,添加“手動typeid”傳遞給基類,並進行相應的調度(討厭這個……),等等)

如果不想使用虛函數的原因是避免使用RTTI,則可以使用CRTP習慣用法實現靜態多態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM