博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] 还是虚函数那些事
阅读量:7231 次
发布时间:2019-06-29

本文共 1347 字,大约阅读时间需要 4 分钟。

关于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);这部分摘自百度知道

定义一个函数指针类型。

比如你有三个函数:
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++在安全性上的考虑是欠缺的,至少可以说是不严谨的。

 

 

 

 

 

 

 

你可能感兴趣的文章
C#趋势图(highcharts插件)
查看>>
stm32的flash编程
查看>>
java多线程-AbstractQueuedSynchronizer
查看>>
苹果新的编程语言 Swift 语言进阶(十四)--扩展
查看>>
Md5加密方法
查看>>
转:zookeeper中Watcher和Notifications
查看>>
函数的参数
查看>>
Java编程规范
查看>>
【洛谷 P1070】道路游戏 (DP)
查看>>
走迷宫(回溯、深搜)判断能否到终点
查看>>
Zookeeper权限管理与Quota管理
查看>>
CORS 详解
查看>>
【原】iOS学习之苹果原生代码实现Autolayout和VFL语言
查看>>
ASP.NET MVC中使用FluentValidation验证实体
查看>>
usb mass storage device
查看>>
CentOs7
查看>>
python3封装Api接口
查看>>
jar包双击执行引用外部包问题
查看>>
OI复习计划
查看>>
about
查看>>