关于C++类成员函数转换的疑惑,各位高手帮忙看下··
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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的成员函数?
如果你真的想知道真实的情况.....我可以负责任的告诉你
这是一个假象
我如果乐意 我完全可以这样写
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 <stdio.h>
#include <string>
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;
追问
你好,看了你的回答,我学到了不少东西,也按照你的方法试验了,的确崩溃了,你能解释一下为什么成员函数中有赋值语句的时候就崩溃了吗? 这些分都会给你的
追答因为成员函数只是一段地址,而不操纵内存,就不会引起崩溃啊...函数是已经给做好的 只要进去就可以了,所以怎么样调用 只要知道一个地址就可以了.....而一旦有成员变量就牵扯到成员变量的内存,如果不正确 就会崩溃....这种问题 等你对c++有深入的了解了 在去探究为什么 ...
参考技术A 1.为什么CB的成员函数地址可以赋给CA的成员函数指针?没有类型检查吗?解答 因为CA是CB的基类 基类的指针可以指向其派生类的对象的 第一个问题解决了
2是在调用CA的成员
void CallFun(pFun pfun,CA ca)
CA a;
CallFun((pFun)&(CB::output),a);
以上是关于关于C++类成员函数转换的疑惑,各位高手帮忙看下··的主要内容,如果未能解决你的问题,请参考以下文章