1

如果函数指针在基类中定义并赋值。它必须用来从派生它的类中调用一个函数。我们怎么做到这一点?C++:通过基类中定义的函数指针派生函数调用

This显示了一个通过指针调用函数的示例。但是,这仅适用于指针在与使用位置相同的类中定义的情况。

This显示调用父类函数的示例。我尝试了一些类似的东西,但没有奏效。

From derived 
(((Base)this)->*fncPtr)(); 
(((Base)this)->*(Base::fncPtr))(); 

以上两种都不起作用。请帮助我。

+0

对于这种情况,您最好使用_Template函数Pattern_而不是函数指针。 –

+0

你是否建议没有解决方案。除了使用模板功能模式? – PHcoDer

+0

我认为这将是更好,更直接的解决方案(可能更少出错)。 –

回答

3

只需使用:

(this->*fncPtr)(); 

没有别的要求。强制转换为基本类型是隐含的。所以你不需要明确地施放它。

1

给定一个指针的Derived成员函数:

void (Derived::*derivedFncPtr)() = &Derived::someMemberFunction; 

首先,将它转换为一个指针的Base成员函数:

void (Base::*baseFncPtr)() = static_cast<void (Base::*)()>(derivedFncPtr); 

然后,调用它:(假设*this是一个Base动态型Derived

(this->*baseFncPtr)(); 

Live example

+0

谢谢。但是这里指向成员函数的指针也是基类。 – PHcoDer

+0

我不知道你的意思。你能改善这个问题吗? – Oktalist

+0

完成。请再次参阅示例代码。我之前在示例代码中犯了一些错误。 – PHcoDer

1

如果你有一个指向基void (Base::*fncPtr)()的成员函数,你可以用一个指针以完全相同的方式调用它来派生类对象this,你会叫一个指向同一个派生类的成员函数。

(this->*fncPtr)(); 

Demo here


(((Base)this)->*fncPtr)(); 

您可以显式转换thisBase的指针,如果你真的想(它不是必需的),但这不是它是如何自Base以来完成的操作不是指针类型。这将工作:

((Base*)this)->*fncPtr)(); 

但正如我所说,演员是多余的。

相关问题