大家好,我是阿林。今天我们分享的内容是c++的多态的原理。

多态可以实现继承子类可以通过父类指针去调用形成面向对象的函数的调用。我们虽然懂得了多态的使用方法。但我们却对多态实现的原理知道的比较少。我们现在来了解一下多态的原理吧。

多态通过虚函数实现,那虚函数是怎么通用面向对象的函数呢,以下是我对其过程的理解。

虚函数在声明时候,编译器会再类中生成一个虚函数表
如果func不是虚函数,编译器可以直接确定被调用得成员函数,(静态联编)
如果func是虚函数,编译器根据对象p的vptr指针,所指向的虚函数表中查找func函数,并调用。(动态联编)

最后让我们编译下程序去加深理解把。

#include <iostream>using namespace std;//多态成立的三个条件
//要有继承 虚函数重写 父类指针指向子类对象class Parent
{
public:Parent(int a = 0){this->a = a;}virtual void print(){cout << "我是爹" << endl;}
private:int a;
};class Child :public Parent
{
public:Child(int a = 0, int b = 0):Parent(0){this->b = b;}virtual void print(){cout << "我是儿子" << endl;}
private:int b;
};void HowToPlay(Parent* base)
{base->print(); //有多态发生 //1 动手脚 写virtual关键字 会特殊处理//c++编译器根本不需要区分是子类对象还是父类对象//子类对象和父类对象分步有vptr指针,===》虚函数表===>函数的入口地址。//迟绑定(运行时,c++编译器才去判断)
}int main()
{Parent p1;//动手脚 用类定义对象的时候 c++编译器会在对象中添加一个vptr指针Child c1;HowToPlay(&p1);HowToPlay(&c1);system("pause");return 0;
}
/*
虚函数在声明时候,编译器会再类中生成一个虚函数表
如果func不是虚函数,编译器可以直接确定被调用得成员函数,(静态联编)
如果func是虚函数,编译器根据对象p的vptr指针,所指向的虚函数表中查找func函数,并调用。(动态联编)*/

C++day07 多态的原理相关推荐

  1. 疯狂涨知识!Java多态实现原理技术总监都拍手叫好

    ##前言 多态是Java语言重要的特性之一,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.Java对于方法调用动态绑定的实现主要依赖于方法表,但通过引用调用(invokev ...

  2. 继承的原理java_Java继承和多态的原理

    ### 继承 继承是复用代码的一种非常重要的方式,在声明类时显示的使用extends关键字继承另一个类,即可获得这个类中的全部域,包括成员变量和方法. 一个类在虚拟机中的存在方式:虚拟机加载类后,在方 ...

  3. 多态的概念,多态的原理,多态解决什么问题

    目录 一.多态能解决什么问题 二.多态的概念 三,多态的原理 一.多态能解决什么问题 问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数 (包括析构函数也不能访问)----(这也是为 ...

  4. C++多态的原理(虚函数指针和虚函数表)

    C++多态的原理 (虚函数指针和虚函数表) 1.虚函数指针和虚函数表 2.继承中的虚函数表 2.1单继承中的虚函数表 2.2多继承中的虚函数表 3.多态的原理 4.总结 1.虚函数指针和虚函数表 以下 ...

  5. Java基础(多态实现原理)

    Java 多态实现原理 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现. 现实中,比如我们按下 F1 ...

  6. 【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理

    多态 1. 多态 2. 多态的定义和实现 2.1 多态的条件 2.2 虚函数重写的两个例外 2.2.1 协变 2.2.2 析构函数的重写 2.3 只有父类带 virtual 的情况 2.4 C++11 ...

  7. [C++](16)多态:虚函数,使用,多态的原理

    文章目录 概念 定义及实现 虚函数与重写(覆盖) 多态构成条件 虚函数重写的例外 协变 接口继承 析构函数的重写 C++11 的 final 和 override 重载.隐藏(重定义).重写(覆盖)的 ...

  8. C++中的多态——理解虚函数表及多态实现原理

    多态及其实现原理 一.多态的概念 概念 构成条件 二.虚函数的重写 重写的定义 重写的特殊情况 override和final关键字 区分重写.重载.重定义 抽象类的概念 三.多态的实现原理 父类对象模 ...

  9. [java] 反射和多态实现原理详解以及对比

    Table of Contents 反射和多态 多态 什么是多态 java里多态的具体用法 多态的实现原理 反射 什么是反射 反射的实现原理 反射的应用 反射的弊端 反射相关类 反射应用实例 一些问题 ...

最新文章

  1. 手机客户端和web端开发的异同
  2. 如何实现手机自动适应网页
  3. navicat连接oracle无监听程序_一个Java程序员的成长历程(022天)
  4. 第五章Bookstrap
  5. Linux中一切皆文件
  6. VS2015新建项目无法选择framework 4.6.2
  7. app4788usvod3html,ROBOHAND RPLC-3
  8. NYOJ--364--田忌赛马
  9. 熊猫烧香源码--假的:)
  10. hashmap java 排序_Java HashMap 默认排序
  11. 在ubuntu上卸载anaconda
  12. CSS border 属性
  13. 记一个阿里巴巴 平台型产品经理 面试
  14. 刍议当代大学生恋爱观
  15. 妈妈说就算你注册的域名再长GOOGLE都能搜索出来,百度也有妈妈!
  16. 《我的成长》半月刊2009年第2期(总第2期)[4月上]
  17. 明日方舟抽卡模拟器wiki_明日方舟抽卡模拟器
  18. 怎么取名都不队-DevOps
  19. 不可替代的测试人:一文解释探索性测试是什么
  20. 庄家猎杀散户的七大骗术

热门文章

  1. python雪人_在Python乌龟画中通过箭头键使雪人移动
  2. E4A雪人影视APP源码
  3. 趣链科技张帅博士:有望最先落地AI+区块链的是金融领域
  4. 如何使用adb工具进行查看Android中创建的数据库文件
  5. AI音乐创作,让每一个人都成为音乐家
  6. [Python][自己写的杀病毒脚本]
  7. 强化学习(实践):DQN,Double DQN,Dueling DQN,格子环境
  8. css学习记录三:文本属性
  9. 信息学奥赛一本通(1168:大整数加法)
  10. swf文件用什么打开