C++多态到底是什么?
书上讲
在面向对象语言中,对于接口的不同实现方式称之为多态。多态性时允许将父类对象设置成为一个或者多个他的子类对象相等的技术一般用指针实现,赋值之后,父类对象可以根据当前赋值给他的子类对象的特性以不同方式进行调用。
那么上面说的是怎么做到的呢?
我们看下面这个代码
#include <stdio.h>
#include <stdint.h>
static int body = 0;
class Base
{
public:
Base() {
printf("construct base\n");
}
virtual ~Base() {
printf("release base\n");
}
virtual void func() {
printf("run func\n");
}
void Dump() {
printf("dump me\n");
}
};
class BaseA: public Base
{
public:
BaseA() {
printf("construct baseA\n");
}
virtual ~BaseA() {
printf("release baseA\n");
}
void func() {
printf("run BaseA func\n");
}
};
void dump(const char *info, char *addr)
{
int64_t *d = (int64_t*)addr;
printf("%s content %ld\n", info, *d);
}
int main()
{
Base *b = new BaseA();
b->func();
b->Dump();
char *addr = (char *)b;
dump("class son", addr);
delete b;
Base *c = new Base();
char *addr1 = (char*)c;
dump("class base", addr1);
delete c;
Base *e = new BaseA();
e->func();
char *addr3 = (char *)e;
dump("class son", addr3);
delete e;
Base *d = new Base();
char *addr2 = (char*)d;
dump("class base", addr2);
delete d;
printf("body %p\n", &body);
return 0;
}
我们知道虚函数式通过虚函数表调用的,对象里面最前面都存放了虚函数表的首地址,就像我上面打印出来的。这个表应该是个只读数据段。
基类 *p = new 派生类
C++允许派生类指针直接赋值给基类,虽然对象类型变了,但是new的内容没有变,还是派生类。
那么它的虚函数表指针肯定是派生类的。现在有派生类虚函数表了,那是怎么调用到派生类的虚函数方法的呢?
看下反汇编,
通过上面的图很容易看到,其实虚函数的调用和普通函数是不一样的,
虚函数是通过虚函数表的地址,偏移,然后取到的一个函数指针,然后执行这个函数指针指向的函数。而普通的函数,直接有自己的地址,直接callq就可以了。
2 接下来我们来探讨另一个问题, 这种情况的装饰模式怎么实现的呢?
常见的装饰模式代码,
class Base
{
virtual int Func();
};
class BaseA:public Base
{
int Func() {
Base::Func();
printf("run Func\n");
}
};
我们反汇编一下,看下是如何调用的。
看起来域操作符可以直接解除virtual的限制。
直接调用到了Base类的被重写的方法。
C++多态到底是什么?相关推荐
- Java的多态到底是什么意思?-sunziren
在我们开始之前,请记住这句话:父类引用指向子类对象. 问题1:什么是多态? 答:多态就是父类的一个方法,被不同的子类重写成了不同的实现:或者说多态就是两个类,都实现了接口中的同一个方法,但具体实现的内 ...
- java中多态到底是什么_java中的多态是指什么
java中的多态是指什么 发布时间:2020-06-28 09:59:19 来源:亿速云 阅读:119 作者:Leah java中的多态是指什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希 ...
- 【基础篇】java的多态到底是什么?(详细案例逐步分析)
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯.虽然学习起步较晚,但我坚信做了才有0或1的可能.学了一段时间以后也是选择在CSDN上分享自己的日常笔记,也希望能够在众多道友 ...
- C++多态的概念及前提条件(最精辟)
原文链接 在 C++ 程序中,每一个函数在内存中会分配一段存储空间,存储空间的起始地址则为函数的入口地址.例如我们在设计一个程序时都必须为程序设计一个主函数,主函数同样会在内存中被分配一段存储空间,这 ...
- C++类的使用(五)—— 多态
时隔数月,我决定把这个系列继续写下去. 多态,顾名思义,就是多种形态,多种类型. 那就奇怪了,难不成可以把一个类直接转成另一个类? 错,其实多态是指从一个继承系里的类型互相转换. 先看代码事例 #in ...
- java 继承 封装 多态 详解
1.继承 1.1子类能够继承父类的哪些成员? 1.1.1 public 成员 1.1.2 protected 成员 1.1.3 同一个包中:缺省访问类型的成员 1.1.4 打死不能继承private成 ...
- 深入浅出话多态(上)——具体而微
深入浅出话多态(上)--具体而微 小序 前几天写了一篇<深入浅出话委托>,很多兄弟姐妹发Mail说还算凑合,又有兄弟说能不能写一篇类似的文章,讲解一下什么是"多态".一 ...
- C# 温故而知新:Stream篇(二)
C# 温故而知新:Stream篇(二) TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 ...
- 【Python基础】Python 面向对象编程(上篇)
我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...
最新文章
- 数据库里存json数据
- Canvas基础知识
- 补第一阶段冲刺站立会议3(应发表日期5月15日)
- SDUT 2133 数据结构实验之栈三:后缀式求值
- TensorFlow 保存和加载模型
- JAVA开发面试常问问题总结4
- Leetcode每日一题:17.letter-combinations-of-a-phone-number(电话号码的字母组合) 0ms通过
- select、poll、epoll的区别
- ToStringBuilder学习(一):常用方法介绍
- java 正则车牌_javascript匹配车牌号正则表达式
- linux下安装百度云音乐,linux 安装网易云音乐
- C语言 —— 回调函数
- 【html5插入透明Webm视频】
- 西安周边旅游++军事纪实
- oracle SDO_ORDINATE_ARRAY直接展示
- 2022年宋干节活动-乌隆他尼皇家大学
- MATLAB笔记之复数以及基本复数函数二维视角(2d)图形绘制
- 阿里云后台测试短信模板
- osgEarth示例分析——osgearth_skyview
- 织梦手机站 html 插件,织梦DEDECMS手机端生成静态页面插件完整版
热门文章
- oracle 11g ins_,Oracle 11.2.0.1 INS-32025 INS-52001 解决方法
- 应聘/求职----上海IT公司红黑榜TOP100
- 推荐适合新手入门的音频剪辑软件推荐
- 快速傅里叶变换(FFT)(学习笔记)
- 北京尚学堂退课退课,口碑还不错
- 新课程改革的理论基础究竟是什么
- 学计算机改变命运?有意思的考研调剂宣传
- Saber吃苹果,保持每箱苹果数量递增
- C语言实现PTA题目--跳一跳
- android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...