【发布时间】:2015-07-17 13:12:46
【问题描述】:
所以我想使用成员函数指针的真正原因是从对象类型未知且所有对象都被视为 void * 对象的地方调用函数。但我无法这样做,即使从理性上看,函数指针似乎指向子例程的地址,因此对象的类型应该是无关紧要的。我的假设是系统所要做的就是将“this”指针设置为调用成员函数指针的对象。下面是我的代码。我怎样才能达到我想要的目标
class C2
{
public:
int y;
void SetValue(int);
};
void C2::SetValue(int k)
{
cout<<"Setting Value inside C2"<<endl;
y=k;
}
int main()
{
void (C2::*f)(int);
C2 *Ob=new C2();
void *Ob2=(void *)Ob;
f = &C2::SetValue;
((Ob2)->*f)(10);
}
这段代码甚至没有用 VC++ 编译器编译,错误为
错误 C2296: '->*' : 非法,左操作数的类型为 'void *'
【问题讨论】:
-
如何在不知道成员所属类型的情况下拥有成员函数指针?在您的示例中,
f的类型为void (C2::*)(int),因此您知道必须在C2的实例上调用它。 -
您想要从
void到您的类型的隐式转换?! -
但是我已经将函数指针设置为指向特定类的成员函数,即类 C2。所以期望是不管调用函数指针的对象是什么,函数都应该被执行
-
听起来您可能想要使用继承和虚函数。
void *不应该是现代 C++ 中常见的东西。 -
@Raks "不管调用函数指针的对象是什么,函数都应该被执行" => 这违背了 C++ 类型系统。 C++ 是强类型和静态类型的:如果你有一个函数需要一个 int 作为参数,你只能用一个 int 来调用它。成员函数指针也是如此,编译器会阻止您使用
void *调用成员函数,因为这不是类型安全的(您的对象可能不是C2),因此您必须明确“绕过”该类型系统使用演员表:(static_cast<C2>(Ob2)->*f)(10);
标签: c++ pointers function-pointers