首先,我不是 C++ 专家(我正在努力学习 C++ 这么深)。如果我错了,请纠正我,这是一个实验。
作为学习成员函数指针的一部分,我还在搜索代码示例以使用基成员函数指针调用派生成员。通过这个线程后,我创建了一个代码示例,即使成员函数不是虚拟的,它也能够调用派生成员函数。
我正在使用委托人充当调用者。我希望它可能对某人有所帮助。(纠正我如果我做错了什么)
class AbstractBase
{
protected:
AbstractBase()
{};
virtual ~AbstractBase()
{};
public:
//Place holder method
void SimpleMethod(void)
{
printf_s("\nAbstractBase::SimpleMethod");
};
};
class Derived : public AbstractBase
{
public:
//This overridden but not virtual.
void SimpleMethod(void)
{
printf_s("Derived::SimpleMethod");
};
};
typedef void (AbstractBase::*SimpleMethodCallback)();
class Delegator
{
private:
AbstractBase * pbasePtr;
SimpleMethodCallback pCallback;
public:
Delegator()
{
this->pbasePtr = nullptr;
this->pCallback = nullptr;
};
void RegisterCallback(AbstractBase * pbasePtr, SimpleMethodCallback callback)
{
if (pbasePtr == nullptr || callback == nullptr)
throw "Delegate target or callback cannot be null";
this->pbasePtr = pbasePtr;
this->pCallback = callback;
};
void Invoke()
{
if (this->pbasePtr == nullptr || this->pCallback == nullptr)
throw "Inoke cannot be performed on null target or callback";
(pbasePtr->*pCallback)();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Delegator delegate;
delegate.RegisterCallback(new Derived(), reinterpret_cast<SimpleMethodCallback>(&Derived::SimpleMethod));
delegate.Invoke();
return 0;
}
输出:
delegate.Invoke() 将调用 Derived::SimpleMethod() 并且输出将是“Derived::SimpleMethod”**