#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. What is machine learning?

    What is machine learning? One area of technology that is helping improve the services that we use on ...

  2. 在安全层面,企业如何获得更好的投资回报率 ROI?

    前言 任何企业对投资都有回报的要求,回报可能是直接的「利润」,达到短期.长期的目标,或者通过投资减少损失.因此每个项目的决策者在每笔投资前都要衡量 ROI,证明该投资能达到的效果和收益,以便在项目结束 ...

  3. 纯手工全删除域内最后一个EXCHANGE--How to Manually Uninstall Last Exchange 2010 Server from Organization

    http://www.itbigbang.com/how-to-manually-uninstall-last-exchange-2010-server-from-organization/ 没办法, ...

  4. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...

  5. 几个RTP的开源实现

    玩了两天rtp协议,基本把rtsp/rtcp/rtp/rtmp/srtp/strcp/mms,几个协议的区别和概念弄明白了. 这里记录一下. rtsp:类似用户界面操作,和Http比较类似,提供播放, ...

  6. 【HDOJ】3047 Zjnu Stadium

    带权并查集. /* 3047 */ #include <iostream> #include <string> #include <map> #include &l ...

  7. WCF - net.pipe vs. net.tcp vs. http Bindings

    WCF - net.pipe vs. net.tcp vs. http Bindings 问题: I'm new to WCF and would like to know the differenc ...

  8. 用sql语句写排名

    使用SQL语句求排名 表jh03有下列数据: name score aa 99 bb 56 cc 56 dd 77 ee 78 ff 76 gg 78 ff 50 1. 名次生成方式1 , Score ...

  9. Cocoapods 64-bit(iPhone5s) 问题解决方案

    把 主工程 和 Pods 中的所有的 Architectures --> Architectures 改为 Standard architectures(arvmv7, armv7s), 去掉 ...

  10. suse系统卸载数据库实例

    1.停止数据库: 2.执行以下命令: find $ORACLE_BASE/* -name '*[Tt][Ee][Ss][Tt]*'  其中TEST为数据库的实例名: 删除存在的文件: 3.删除/etc ...