【C++面向对象】10. 多态

文章目录

  • 【 前言 】
  • 【 虚函数 】
  • 【 纯虚函数 】

【 前言 】

  • 多态按字面的意思就是多种形态。当 类之间存在层次结构,并且类之间是通过继承关联时 ,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数
  • 实例:基类 Shape 被派生为两个类,定义基类的指针,指针指向两个派生类的对象,分别调用派生类内部的成员函数 area() 。
#include <iostream> 
using namespace std;class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}int area(){cout << "Parent class area :" <<endl;return 0;}
};
class Rectangle: public Shape{public:Rectangle( int a=0, int b=0):Shape(a, b) { }int area (){cout << "Rectangle class area :" <<endl;return (width * height); }
};
class Triangle: public Shape{public:Triangle( int a=0, int b=0):Shape(a, b) { }int area (){ cout << "Triangle class area :" <<endl;return (width * height / 2); }
};
// 程序的主函数
int main( )
{Shape *shape;Rectangle rec(10,7);Triangle  tri(10,5);shape = &rec;// 存储矩形的地址shape->area();// 调用矩形的求面积函数 areashape = &tri;// 存储三角形的地址shape->area();// 调用三角形的求面积函数 areareturn 0;
}

在这里插入图片描述

  • 导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的 静态多态 或 静态链接,即 函数调用在程序执行前就准备好了, area() 函数在程序编译期间就已经设置好了,有时候这也被称为早绑定。

【 虚函数 】

  • 为了使得基类指针指向的派生类的对象都能调用派生类内部与基类内部名字相同的成员函数,引入 虚函数 的概念。
  • 虚函数 是指在基类中使用 关键字 virtual 声明的函数。
    虚函数声明后如果子类不实现这个函数,编译器会报错,所以一定要实现。
  • 在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数,我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为 动态链接,或 后期绑定
  • 实例:现在让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <<endl;return 0;}
};

在这里插入图片描述

  • 此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。这样就可以,让每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。 有了多态,我们可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

【 纯虚函数 】

  • 父类声明了虚函数,子类可以声明一个同名函数(同参数)覆盖,如果不声明,就会默认执行父类的这个函数。如果 我们在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

  • 实例:我们可以把基类中的虚函数 area() 改写如下:

class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;
};
  • virtual int area( )= 0 告诉编译器,函数没有主体,虚函数 area( ) 是纯虚函数。
	virtual int area() = 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+express重定向

前言&#xff1a; 本篇代码中需要安装的依赖包包括&#xff1a;request、express 1.常用重定向方法 nodejs中的重定向可以使用.redirect()方法&#xff0c;该方法中可以传两个参数&#xff1a;code和path&#xff0c;code指重定向时&#xff0c;当前访问的这个接口的返回码3…

技巧篇:Mac 环境PyCharm 配置 python Anaconda

Mac 中 PyCharm 配置 python Anaconda环境 在 python 开发中我们最常用的IDE就是PyCharm&#xff0c;有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库&#xff0c;用的最多的命令就是pip install 第三方库名 进行安装。现在你可以使用一个工具来帮你解…

threejs (四) 纹理 Texture

定义&#xff1a;纹理图片&#xff08;或canvas/video等&#xff09;映射到物体表面&#xff0c;或者作为反射、折射贴图&#xff0c;也就是物体的皮肤。 1、纹理贴图分类 map&#xff1a;颜色贴图&#xff0c;存储颜色信息bumpMap&#xff1a;凹凸贴图&#xff0c;性能贴图&…

基于SpringBoot+Vue的在线外卖管理系统

基于SpringBootVue的在线外卖管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 下单界面 登录界面 商家界面 摘要 本文介绍了一种基于Spring Boot和…

绩效考核管理项目|记录1

项目用C#winformSQL Server写的&#xff0c;现在记录一下学习到的新东西。 winform工具 splitContainer&#xff1a;分割出两个容器&#xff0c;能添加面板之类的工具 treeview&#xff1a;展示标签页的分层集合&#xff08;用户管理、基数管理......&#xff09;&#xff0…

分享篇:我用数据分析做副业

主业是数据分析专家&#xff0c;副业是数据咨询顾问&#xff0c;过去十年里面利用数据分析发家致富 人生苦短&#xff0c;我学Python&#xff01; 利用技能可以解决的问题&#xff0c;哪些场景下可以催生出需求&#xff0c;深度剖析数据分析的技能树 由浅入深&#xff0c;一个…

js 变量声明与赋值 笔试踩坑题

文章目录 概述函数声明函数形参与实参函数预编译用一个例子说明一下&#xff0c;这四个步骤分别要干些什么。重复四个步骤&#xff0c;反复练习一下 全局编译多重执行期上下文 概述 别小看变量声明与赋值&#xff0c;在所有的笔试中&#xff0c;基本都会考&#xff0c;这个要多…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f

解决Python requests库不支持发送可迭代对象的问题

在加班的路上&#xff0c;bug是那永远的陪伴。对于程序员来说&#xff0c;bug就像黑暗中的萤火虫&#xff0c;虽然微弱却永远指引着前进的方向。今天&#xff0c;我们要探讨的是Python requests库在处理可迭代对象时遇到的问题&#xff0c;这是一道让许多开发者头痛的难题。本文…

阿里云今年服务器是真便宜,看看哪些云服务器值得买!

2023年双十一&#xff0c;阿里云推出了一项令人惊喜的独家优惠活动&#xff01;在这次活动中&#xff0c;阿里云开放了老用户购买权限&#xff0c;以超低的价格购买云服务器ECS经济型e实例。这款服务器配置了2核2G内存、3M固定带宽和40G ESSD entry系统盘。而且&#xff0c;更棒…

一个用于操作Excel文件的.NET开源库

推荐一个高性能、跨平台的操作Excel文件的.NET开源库。 01 项目简介 ClosedXML是一个.NET第三方开源库&#xff0c;支持读取、操作和写入Excel 2007 (.xlsx&#xff0c; .xlsm)文件&#xff0c;是基于OpenXML封装的&#xff0c;让开发人员无需了解OpenXML API底层API&#xf…