#include <iostream>

using namespace std ;

class Father

{

private :

 virtual void Say()  //只有添加了virtual 关键字声明才会产生虚函数表 虚函数表在编译的时候确定  virtual是实现多态的关键

 {

   cout<<"Father::Say()"<<endl ;

 }

 virtual void Run()

 {

  cout<<"Father:Run()"<<endl;

 }

};

class Son :public Father

{

public:

 

  virtual void Run()  //派生类虚函数地址 替换父类函数地址在虚函数表中的位置  如需继续被集成那么 仍然要加上virtual

 {

  cout<<"Son:Run()"<<endl;

 }

virtual void MakeLove()  //派生类也需要有virtual才有虚函数表函数   派生类只有声明了virtual才会把函数加入虚函数表

   {

     cout<<"Son::MakeLove();"<<endl;

   }

};

class SmallSon:public Son

{

public:

 virtual void Run()  //

 {

  cout<<"SmallSon:Run()"<<endl;

 }

 

};

typedef void(*Func)() ;  //定义一个函数类型定义

void main()

{

    Father fa;

 Func func=NULL ;

 cout<<"Virtual Table Address:"<<&fa<<endl ; 

 func=(Func)*((int*)*(int*)(&fa));//把对象首地址转换为int*防止翻转为对象 然后取出virtual table地址 然后在取出第一个虚函数的存放地址转换为int*

                                //对象首地址存放虚函数表的地址 ,然后转换为int* 取出 虚函数表第一个函数 顺序是虚函数声明顺序

                               //完全拜托了C++权限控制 这也是C++的缺陷

    func();

     func=(Func)*((int*)*(int*)(&fa)+1);

func();

   Son son ;

   func=(Func)*((int*)*(int*)(&son));

   func();

   func=(Func)*((int*)*(int*)(&son)+1);

   func();

   func=(Func)*((int*)*(int*)(&son)+2);

   func();

SmallSon sson ;

   ((Func)*((int*)*(int*)&sson))();

   ((Func)*((int*)*(int*)&sson+1))();

//多层继承 一个表 多重继承多个表   表地址在 对象首地址开始存放

}

看懂下面C++代码才说你理解了C++多态虚函数!的更多相关文章

  1. 写在最前面 - 《看懂每一行代码 - kubernetes》

    我要写什么 <看懂每一行代码 - kubernetes>会包含k8s整个项目的源码解析,考虑到门槛问题,在开始分析k8s之前我会通过一些更低难度的golang开源项目讲解来帮助大家提升go ...

  2. Android中活动的最佳实践(如何很快的看懂别人的代码activity)

    这种方法主要在你拿到别人的代码时候很多activity一时半会儿看不懂,用了这个方法以后就可以边实践操作就能够知道具体哪个activity是干什么用的 1.新建一个BaseActivity的类,让他继 ...

  3. VCL代码的一些设计手法(使用OO虚函数的技巧)

    1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位) ...

  4. T4代码生成脚本从添加注释,添加命名空间开始(一款强大的代码生成工具从看懂脚本,到随心所欲的玩弄代码,本文只是T4的冰山一角,博主将不断深入探索并完善该文章)

    精通T4脚本要从读懂脚本的关键代码片段开始  1.1. 给类添加注释-->看懂类对应的代码:<#=codeStringGenerator.EntityClassOpening(entity ...

  5. 从字符串到常量池,一文看懂String类设计

    从一道面试题开始 看到这个标题,你肯定以为我又要讲这道面试题了 // 这行代码创建了几个对象? String s3 = new String("1"); 是的,没错,我确实要从这里 ...

  6. 【Luogu】P2765魔术球问题(没看懂的乱搞)

    题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2 ...

  7. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  8. C语言-人狼羊菜问题-最容易看懂的解决方法及代码

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  9. 一文看懂Stacking!(含Python代码)

    一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ

随机推荐

  1. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...

  2. IIS 500 – 内部服务器错误解决方案

    最近装了测试机windows2008使用IIS7.5各种不习惯呀,各种问题,唉.. 今天又遇到了“500 – 内部服务器错误. 您查找的资源存在问题,因而无法显示.”的问题,网上查找了一下,找到解决办 ...

  3. Android java程序获取assets资产文件

    AssetManager assetManager=this.getAssets(); inputStream = assetManager.open("test.xml");

  4. android Mediaplayer硬件解码浅探

    在讨论stagefright如何调用硬件解码之前,我们要先清楚几个问题. 我不展开这几个结论是如何得来的,因为这部分属于进程间通信binder的理解,和多媒体本身无关. 一.问题空间 这个有点像方法学 ...

  5. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  6. html表格cell合并插件

    数据展示时需要合并部分数据自己写了一个简单插件 合并前: 合并后: 调用示例: var trs = $('table#dataList tbody tr').not('#demo').get(); v ...

  7. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  8. JAVADOC时候乱码-编码 GBK 的不可映射字符

    1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步.在Javadoc Generation对话框中有两个地方要注意的:ja ...

  9. Code generated using the T4 templates for Database First

    Error message: Code generated using the T4 templates for Database First and Model First development ...

  10. Square

    Square TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Totalsubmit: 1638   Accepted: 440 Description ...