关于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的成员函数?

第一个问题 关于类型检查 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 <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++类成员函数转换的疑惑,各位高手帮忙看下··的主要内容,如果未能解决你的问题,请参考以下文章

C++大纲及疑惑点三

C++大纲及疑惑点三

C++大纲及疑惑点三

想【C++ 】高手发起挑战,请教一个【动态链接库 dll 和 类成员函数 显式链接】问题

C/C++ 关于union的一些疑惑,求高手帮忙解惑

一个关于C++多继承的问题