【发布时间】:2016-10-16 18:40:34
【问题描述】:
我创建了一些类层次结构,其中的基类(在以下示例中:clA)定义了从executor 例程调用的函数指针。反过来,作为回调传递executor 的代码不知道它在哪种类型的派生对象上运行(clB 只是其中之一)。如果派生类没有实现某些函数,它不会强制转换为函数指针,并且在调用 executor 时不会发生任何事情。还有一些虚函数(clA 实际上是纯虚函数)。我的类看起来与此类似(无法呈现实际代码,因此我创建了简化的演示):
class clA
{
protected:
INT_PTR(__stdcall clA::*Fn1)(int);
INT_PTR(__stdcall clA::*Fn2)(int);
static INT_PTR CALLBACK executor(UINT operation, int opData, clA *ptr = NULL)
{
switch (operation)
{
case 1:
if (ptr->Fn1)
{
typedef INT_PTR(__stdcall clA::*FPtr)(int);
FPtr funcPtr = ptr->Fn1;
return (ptr->*funcPtr)(opData);
}
break;
case 2:
if (ptr->Fn2)
{
typedef INT_PTR(__stdcall clA::*FPtr)(int);
FPtr funcPtr = ptr->Fn2;
return (ptr->*funcPtr)(opData);
}
break;
}
}
public:
clA() { Fn1 = NULL; Fn2 = NULL; }
virtual BOOL vrt(void) = 0;
};
class clB : public clA
{
INT_PTR __stdcall ImplFn1(int) { return 0; }
INT_PTR __stdcall ImplFn2(int) { return 0; }
public:
void testing(void);
clB()
{
Fn1 = reinterpret_cast <INT_PTR(__stdcall clA::*)(int)> (&clB::ImplFn1);
Fn2 = reinterpret_cast <INT_PTR(__stdcall clA::*)(int)> (&clB::ImplFn2);
}
BOOL vrt(void) { return FALSE; };
};
到目前为止一切正常,直到今天我决定我需要基类 clA 来继承其他类,让它成为 clExtra,所以我做了以下更改:
class clExtra
{
public:
static int x;
};
//now class clA is deriving from clExtra
class clA : public clExtra
问题
现在我有以下编译错误:
inheritancetest.h(49): error C2440: 'reinterpret_cast' : cannot convert from 'INT_PTR (__stdcall clB::* )(int)' to 'INT_PTR (__stdcall clA::* )(int)'
Pointers to members have different representations; cannot cast between them
我真的不明白它们是如何突然变成不同的表示的。 MSDN 的可能 C2440 原因示例不适用。奇怪的是,如果我从 clA 类中删除任何虚拟性,我也可以让它编译。如果有人了解可能导致我无法投射的原因,我将永远感激您的解释。
【问题讨论】:
标签: c++ casting member-function-pointers