看懂下面C++代码才说你理解了C++多态虚函数!
#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++多态虚函数!的更多相关文章
- 写在最前面 - 《看懂每一行代码 - kubernetes》
我要写什么 <看懂每一行代码 - kubernetes>会包含k8s整个项目的源码解析,考虑到门槛问题,在开始分析k8s之前我会通过一些更低难度的golang开源项目讲解来帮助大家提升go ...
- Android中活动的最佳实践(如何很快的看懂别人的代码activity)
这种方法主要在你拿到别人的代码时候很多activity一时半会儿看不懂,用了这个方法以后就可以边实践操作就能够知道具体哪个activity是干什么用的 1.新建一个BaseActivity的类,让他继 ...
- VCL代码的一些设计手法(使用OO虚函数的技巧)
1. 抽象类法(VCL不推荐):第一,允许创建抽象类对象,因为语法没问题,但允许其错误.第二,接口更好.第三,如果是混合抽象类,则推荐Place Holder方法2. Place Holder(占位) ...
- T4代码生成脚本从添加注释,添加命名空间开始(一款强大的代码生成工具从看懂脚本,到随心所欲的玩弄代码,本文只是T4的冰山一角,博主将不断深入探索并完善该文章)
精通T4脚本要从读懂脚本的关键代码片段开始 1.1. 给类添加注释-->看懂类对应的代码:<#=codeStringGenerator.EntityClassOpening(entity ...
- 从字符串到常量池,一文看懂String类设计
从一道面试题开始 看到这个标题,你肯定以为我又要讲这道面试题了 // 这行代码创建了几个对象? String s3 = new String("1"); 是的,没错,我确实要从这里 ...
- 【Luogu】P2765魔术球问题(没看懂的乱搞)
题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2 ...
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...
- C语言-人狼羊菜问题-最容易看懂的解决方法及代码
题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...
- 一文看懂Stacking!(含Python代码)
一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ
随机推荐
- BZOJ 1620: [Usaco2008 Nov]Time Management 时间管理
Description Ever the maturing businessman, Farmer John realizes that he must manage his time effecti ...
- windows下DOS命令中查看被占用端口的进程
今天在用tomcat 运行项目时报错: java.net.BindException: Address already in use: JVM_Bind这个错误 刚开始有点怀疑是javaw.e ...
- [转贴]C++调用openssl 的AES加密例子
#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h ...
- 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】
原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置 最近的版本部署包,百度云离线下载:版本:Xama ...
- Hibernate:1对1关系总结。
QQ和QQ空间是1对1关系:配置如下 一.主键关联,双方共同维护表关系,以主键关联 public class QQ { private Long id; private QQZone zone; } ...
- poj1741 bzoj2152
树分治入门 poj1741是男人八题之一,经典的树分治的题目这里用到的是点分治核心思想是我们把某个点i作为根,把路径分为过点i和不过点i先统计过点i这样的路径数,然后在统计其子树中的答案,这样就不断地 ...
- Toad 中的compare使用方法
1.首先连接要对比后执行的数据库 2.设置对比内容 3.对比后的执行脚本
- WCF性能优势体现 【转】
WCF性能优势决定了其受欢迎程度,这些优势主要都体现在:统一性:互操作性:安全与可信赖:兼容性等方面. WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架. ...
- 在Raspberry配置优化安装LNMP环境总结
在Raspberry配置优化安装LNMP环境总结 apt-get update apt-get install nginx apt-get install php5-fpm php5-cli php5 ...
- 排列的Java递归语言实现
在做算法题的时候,发现排列经常被使用到,是一个重要的知识点, 下面是博主修改过的代码,初学者,如有不足,欢迎指出 import java.util.ArrayList; import java.uti ...