[英]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.