设为首页 加入收藏

TOP

还是虚函数那些事
2014-11-23 21:34:26 来源: 作者: 【 】 浏览:8
Tags:还是 函数 那些
关于C++虚函数的一些具体介绍,参见博客虚函数表解析(转至陈皓),就其中涉及的一些问题与大家分享一下。
先来看一段代码:
#include   
using namespace std;  
  
typedef void (*Fun)(void);  
class BaseA  
{  
public:  
    virtual void A1(){cout<<"A1"<A1()=";baseA1->A1();  
  cout<<"baseB1->B1()=";baseB1->B1();  
  cout<<"baseA2->A1()=";baseA2->A1();  
  cout<<"baseB2->B1()=";baseB2->B1();  
  fun= (Fun)*((int*)*(int*)(baseA1)+3);   
  fun();  
  //system("pause");  
    return 0;  
}  

这里有必要首先解释一下 typedef void (Fun*)(void);这部分摘自百度知道http://zhidao.baidu.com/link url=FfhL3LI823olsaln6p-KBKU-BercosGNFxgIpaMNS_ErverXjrenlu1n3NfBd75qfwdw170Aljmk-8YkdaraPa
定义一个函数指针类型。
比如你有三个函数:
void hello(void) { printf("你好!"); }
void bye(void) { printf("再见!"); }
void ok(void) { printf("好的!"); }
typdef void (*funcptr)(void);
这样就构造了一个通用的函数
你用的时候可以这样:
void speak(int id)
{
funcptr words[3] = {&hello, &bye, &ok};
funcptr fun = words[id];
(*fun)();
}
这样的话,如果speak(0)就会显示“你好!”
speak(1)就会显示“再见!”
speak(2)就会显示“好的!”
用于处理参数和返回值的形式都一样,但是功能不确定的一组函数,可以使用函数指针。
比如算术运算符,加、减、乘、除,都可以用typedef int (*calc)(int,int)代表,等等
/***************************************************************************************************************************************************************/
结果会显示什么呢?
baseA1->A1()=C.A1
baseB1->B1()=C.B1
baseA2->A1()=C.B1
baseB2->B1()=C.A1
C1
为什么baseA2->A1() =C.B1 为什么baseB2->B1()=C.A1 相信了解C++虚函数机制 都明白是怎么回事
重点我们放在 fun() 上,显示结果为C1! 不知有木有看到,在类BaseC中的C1是声明在private域中的,但是我们却可以通过操作BaseA1来访问私有函数,(至于为什么可以访问,再次建议先 阅读转载文章,理清C++虚函数的机制) ,这一点足见C++在安全性上的考虑是欠缺的,至少可以说是不严谨的。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU1009 FatMouse' Trade 下一篇C++使用TinyXML解析XML

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)
·想要自学数据分析, (2025-12-27 02:49:14)
·Java 集合框架 - 菜 (2025-12-27 02:19:36)
·Java集合框架最全详 (2025-12-27 02:19:33)