关于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

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/16 10:03:46
关于C++类成员函数转换的疑惑,class CA {public:CA();virtual CA();};class CB :public CA {public:CB();virtual CB();void output(){printf(

关于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;
}

关于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 + +类的成员函数模板例如,RT,另一成员函数是一个静态成员函数,所以要注意写道: 关于友元的描述中,( )是错误的.A.友元函数是成员函数,它被说明在类体内 B.友元函数可直接访问类中的C.友元函数破坏封装性,使用时尽量少用D.友元类中的所有成员函数都是友元函数 下列关于this指针的说法,错误的是().Athis指针只存在于非静态成员函数中Bthis指针指向当前正在操作的对象C在成员函数中对非静态数据成员的访问是通过this指针完成的D静态成员函数中可以通 C++中的this指针是什么意思?下列关于this指针的描述中,正确的是?A.类的成员函数都有this指针 B.类的友元函数都有this指针 C.任何与类相关的函数都有this指针 D.类的非静态成员函数都有this指针 C++:类模板的模板参数___A.只可以作为数据成员的类型 B.只可以作为成员的返回类型C.只可以作为成员函数的参数类型 D.以上三者都可以 关于类的非静态函数和静态函数静态函数主要是用来访问静态成员,不能直接访问类的非静态成员;而非静态函数既可以访问静态成员,也可以访问费静态成员.既然非静态函数把一切都搞定了, 类里面的成员函数与内联函数的区别 1.在一个类的定义中,包含有( )成员的定义.A.数据 B.函数 C.数据和函数 D.数据或函数2.( )只能访问静态成员变量A静态成员函数 B虚函数 C构造函数 D析构函数3.假定AA为一个类,a为该类公有的 定义一个关于日期的类,其中包括私有数据成员year,month,day定义一个关于日期的类,其中包括私有数据成员year,month,day,公有成员函数有构造函数,输出函数及判断是否闰年的函数.然后再主函数中 关于极限的疑惑 类的成员函数在函数内部改变了普通数据成员的值,在主函数中普通数据成员会发生变化吗? 类的成员函数定义出问题,求大神解决! 在类中必须声明成员函数的 ,成员函数的 部分可以写在类外.在类中必须声明成员函数的( ),成员函数的( )部分可以写在类外. 下列关于this指针的描述中,正确的是哪个?(要分析过程)A.类的成员函数都有this指针B.类的非静态成员函数才有this指针关于A选项,书上有句原话“在类的每一个成员函数的形参列表中都有一 c++中定义一个对象时,子类的数据成员和构造函数,还有基类的数据成员和成员函数的顺序是什么,初学者,请指教, c++类 计算平行四边形的面积和周长要求 1、类中要有公有成员、私有成员.数据成员要有子对象、静态数据成员.成员函数要有至少二个普通成员函数,一个静态成员函数,一个友元函数,一个常 C++下列关于this指针的说法正确的是()下列关于this指针的说法正确的是()A this指针式指向类的函数成员的指针B 在类的非静态函数中this指针指向调用该函数的对象C this指针是指向虚函数