当前位置: 首页 > news >正文

C++: 多态实现原理解析

文章目录

      • 1 静态多态
        • 实现
        • 原理
      • 2 动态多态
        • 实现
        • 原理
      • code

1 静态多态

实现

函数重载,在编译器确定

函数重载的条件:

  • 函数名相同
  • 参数个数不同,参数的类型不同,参数顺序不同
  • 返回值类型,不作为重载的标准
原理

函数名修饰(替换),进行命名倾轧

函数执行过程:

  • 预处理 :把头文件的函数声明拷贝到源文件
  • 编译 : 语法分析,同时进行函数汇总
  • 汇编 :生成函数名到函数地址的映射
  • 链接 : 加那个多个文件的符号表汇总合并

2 动态多态

实现

多态实现条件:

  • 父类中有虚函数,即共用接口
  • 子类 override(覆写)父类中的虚函数
  • 通过己被子类对象赋值的父类指引用 或子类对象地址赋值给父类指针,调用共用接口

虚函数声明:

class 类名
{virtual 函数声明;
}

纯虚函数:

  • 纯虚函数只有声明,没有实现,被“初始化”为 0
  • 含有纯虚函数的类,称为 Abstract Base Class(抽象基类),不可实例

声明:

class 类名
{virtual 函数声明 = 0;
}
原理

若类使用虚函数,则会为类生成虚函数表(一维数组,存放了虚函数表的地址),类对象构造时会初始化虚函数表的指针

code

#include <iostream>
using namespace std;class Shape
{
public:Shape(int x,int y):_x(x),_y(y){}virtual void draw(){cout<<"draw Shap ";cout<<"start ("<<_x<<","<<_y<<") "<<endl;}protected:int _x;int _y;
};class Circle:public Shape
{
public:Circle(int x, int y,int r):Shape(x,y),_r(r){}void draw(){cout<<"draw Circle ";cout<<"start ("<<_x<<","<<_y<<") ";cout<<"raduis r = "<<_r<<endl;}private:int _r;
};int main()
{Shape s(3,5);Circle c(1,2,4);// 不能实现多态s = c;s.draw();// 子类对象赋值为父类引用,实现多态Shape &rs = c;rs.draw();//子类对象地址赋值给父类指针,实现多态Shape *ps = &c;ps->draw();return 0;
}

运行结果:
draw Shap start (1,2)
draw Circle start (1,2) raduis r = 4
draw Circle start (1,2) raduis r = 4

相关文章:

  • 微信小程序项目实战遇到的问题
  • 详细分析Python模块中的雪花算法(附模板)
  • Django框架的全面指南:从入门到高级【第128篇—Django框架】
  • 24计算机考研调剂 | 温州大学
  • C# 连接neo4j数据库,包括非默认的neo4j默认库
  • 基于ssm+layui的图书管理系统
  • C语言分析基础排序算法——归并排序
  • jwt以及加密完善博客系统
  • 第八阶段:uni-app小程序 --首页开发(2)
  • macOS - 获取硬件设备信息
  • 分布式ID(8):分布式ID生成方法
  • 【测试知识】业务面试问答突击版3---bug、测试用例设计
  • [蓝桥杯 2015 省 B] 生命之树
  • Python和Java哪一个更适合初学者?
  • 比特币,区块链及相关概念简介(二)
  • hexo+github搭建个人博客
  • ES6系列(二)变量的解构赋值
  • Java-详解HashMap
  • Mithril.js 入门介绍
  • nginx 配置多 域名 + 多 https
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • webpack入门学习手记(二)
  • 阿里云应用高可用服务公测发布
  • 初识 webpack
  • 复杂数据处理
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 简单基于spring的redis配置(单机和集群模式)
  • 聚簇索引和非聚簇索引
  • 开源SQL-on-Hadoop系统一览
  • 浏览器缓存机制分析
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 2017年360最后一道编程题
  • 阿里云重庆大学大数据训练营落地分享
  • 通过调用文摘列表API获取文摘
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)(1.13) SiK无线电高级配置(五)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)Hibernate的二级缓存
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .Family_物联网
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/C# 的字符串暂存池
  • .NetCore 如何动态路由
  • .NET基础篇——反射的奥妙
  • .NET性能优化(文摘)
  • @Builder用法
  • [<事务专题>]
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Android] Android ActivityManager
  • [Android]Tool-Systrace