关于C++类成员函数转换的疑惑,class CA {public:CA();virtual CA();};class CB :public CA {public:CB();virtual CB();void output(){printf("hello,world!");}};typedef void (CA::*pFun)();void CallFun(pFun pfun,CA ca){(ca.*pfun)();}int main(int arg
来源:学生作业帮助网 编辑:六六作业网 时间:2025/02/01 06:52:09
关于C++类成员函数转换的疑惑,class CA {public:CA();virtual CA();};class CB :public CA {public:CB();virtual CB();void output(){printf("hello,world!");}};typedef void (CA::*pFun)();void CallFun(pFun pfun,CA ca){(ca.*pfun)();}int main(int arg
关于C++类成员函数转换的疑惑,
class CA
{
public:
CA();
virtual CA();
};
class CB :public CA
{
public:
CB();
virtual CB();
void output()
{
printf("hello,world!");
}
};
typedef void (CA::*pFun)();
void CallFun(pFun pfun,CA ca)
{
(ca.*pfun)();
}
int main(int argc,char* argv[])
{
CA a;
CB b;
CallFun((pFun)&(CB::output),a);
return 0;
}
这样的程序为什么可以通过?我的迷惑
1.为什么CB的成员函数地址可以赋给CA的成员函数指针?没有类型检查吗?
2.(ca.*pfun)();这句代码是通过CA的对象ca调用的,为什么可以调用到CB的成员函数?
关于C++类成员函数转换的疑惑,class CA {public:CA();virtual CA();};class CB :public CA {public:CB();virtual CB();void output(){printf("hello,world!");}};typedef void (CA::*pFun)();void CallFun(pFun pfun,CA ca){(ca.*pfun)();}int main(int arg
第一个问题 关于类型检查 pFun真实的类型为一函数指针指针,不存在类型检查什么的东东.即使不是继承关系依然可以
如果你真的想知道真实的情况.我可以负责任的告诉你
这是一个假象
我如果乐意 我完全可以这样写
typedef void (CA::*pFun)();
void CallFun(pFun pfun)
{
CA::*pfun();
}
int main(int argc,char* argv[])
{
CA a;
CB b;
CallFun((pFun)&(CB::output));
return 0;
}
这个程序可以正确的编译运行
如果你想知道原因,原因很简单 我写一个例子 你看一下就知道了
class CC
{
public:
void output()
{
printf("hello,world!");
}
};
int main(int argc,char* argv[])
{
CA* a=0;
//一个空指针 可以正常运行
((CC*)a)->output();
//甚至这样
((CC*)0)->output();
return 0;
}
其原因在于 当程序运行时,函数的地址已经给出 如果函数里没有需要赋值的东西的时候 这个函数就可以正常运行!但是.一旦出现值的情况例如
class CC
{
public:
void output()
{
val="hello world";
printf("hello,world!");
}
private:
std::string val;
};
int main(int argc,char* argv[])
{
//这时候用上面的方法调用都得崩溃
return 0;
}
你那个程序想崩掉就加一行
#include
#include
class CA
{
public:
CA(){};
virtual CA(){};
};
class CB :public CA
{
public:
CB(){};
virtual CB(){};
void output()
{
val="hello world";
printf("hello,world!");
}
private:
std::string val;
};
typedef void (CA::*pFun)();
void CallFun(pFun pfun,CA ca)
{
(ca.*pfun)();
}
int main()
{
CA a;
CB b;
CallFun((pFun)&(CB::output),a);
return 0;
}