我需要使用一个成员函数指针,它接受在其他代码中使用的基类参数。那么,简单地说,我想要做的[某事]像下面的例子。此代码工作正常,但我不知道这样的演员总是安全吗?我不能在这里施放dynamic
或static
。铸造成员函数指针
#include <cstdio>
class C
{
public:
C() : c('c') {}
virtual ~C() {}
const char c;
};
class D : public C
{
public:
D() : d('d') {}
virtual ~D() {}
const char d;
};
class A
{
public:
A() {}
virtual ~A() {}
void f(C& c) { printf("%c\n",c.c); }
void g(D& d) { printf("%c %c\n",d.c,d.d); }
};
int main (int argc, char const* argv[])
{
void (A::*pf)(C& c) = &A::f;
void (A::*pg)(D& d) = reinterpret_cast<void (A::*)(D&)>(&A::f);
A a;
C c;
D d;
(a.*pf)(c);
(a.*pg)(d);
return 0;
}
你说的代码工作正常,但它甚至不为我编译。 – Xeo 2011-05-31 18:48:47
它编译和(似乎)与'reinterpret_cast'一起工作;我想问题是,这是安全的吗? – 2011-05-31 18:51:35
感觉f和g实际上是虚拟的吗?如果是这样的话,你可以在一些从A派生的类中重写它们。比铸造好得多。 – 2011-05-31 19:15:22