C++学习笔记:多态篇之虚函数
一、类型
在引入多态之前,我们先来看一下多态的两种类型:
二、多态性的概念
多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对象接收时导致不同的行为,这里讲的消息就是指对象的成员函数的调用,而不同的行为是指不同的实现。也就是调用了不同的函数。 概念的给出总是那么的抽象,我们来通过一个具体的例子来看看什么是多态:
#include<iostream> using namespace std; int Add(int left, int right) { return left + right; } char Add(char left, char right) { return left + right; } double Add(double left, double right) { return left + right; } int main() { Add(1, 2); Add('1', '2'); Add(1.2, 2.3); system("pause"); return 0; }
在此函数中,同样的消息加法运算,由于运行时传入的参数类型不同,就会调用不同类型的函数,也就是会有不同的行为响应。
多态性从系统实现的角度来讲可以划分为两类:静态多态(也叫编译时多态性)和动态多态(又称运行时多态性),以前学过的函数重载和运算符的重载属于静态多态性,在程序编译时就能决定调用的是哪一个函数,静态多态是通过函数的重载来实现的(运算符重载实际上也属于函数的重载)。动态多态性是程序运行过程中才动态地确定操作所针对的对象,运行时多态性是通过虚函数来实现的。下面我们就分别看一下静态多态和动态多态。
三、静态多态
静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推
断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。
四、动态多态
即不同对象调用相同命令,相应不同的动作。动态多态是以封装和继承为基础的。
看下面一个例子:
class Shape//形状类
{
public:
double calcArea()
{
cout<<"calaArea"<<endl;
return ;
}
};
class circle:public Shape//圆类
{
public:
circle(double r);//构造函数
double calcArea();
private:
double m_dR;
};
double circle::calcArea()
{
return 3.14*m_dR*m_dR;
} class Rect:public Shape//矩形类
{
public:
Rect(double w,double h);//构造函数
double calcArea();
private:
double m_dw,m_dh;
};
double Rect::calcArea()
{
return m_dw*m_dh;
}
定义一个父类形状类和两个子类圆类和矩形类(计算面积)。
函数实现:
int main(void)
{
Shape *shape1=new circle(4.0);
Shape *shape2=new Rect(3.0,5.0);
shape1->calcArea();
shape2->calcArea();
return ;
}
然而运行时将执行两次:
cout<<"calaArea"<<endl;
并不是我们想要的结果。
在此进入虚函数:动态多态的实现。
、关键字:virtual->虚函数。
用刚才的例子说明问题。
给计算面积的函数加上virtual关键字。
这边可以不加virtual关键字,系统会默认加上。
通过以上虚函数的方法就可以实现多态。
C++学习笔记:多态篇之虚函数的更多相关文章
- PHP学习笔记 - 进阶篇(11)
PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...
- PHP学习笔记 - 进阶篇(10)
PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...
- PHP学习笔记 - 进阶篇(9)
PHP学习笔记 - 进阶篇(9) 图形图像操作 GD库简介 GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新 ...
- PHP学习笔记 - 进阶篇(8)
PHP学习笔记 - 进阶篇(8) 日期与时间 取得当前的Unix时间戳 UNIX 时间戳(英文叫做:timestamp)是 PHP 中关于时间与日期的一个很重要的概念,它表示从 1970年1月1日 0 ...
- PHP学习笔记 - 进阶篇(7)
PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...
- PHP学习笔记 - 进阶篇(6)
PHP学习笔记- 进阶篇(6) 会话控制(session与cookie) 当前的Cookie为: cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. ...
- PHP学习笔记 - 进阶篇(4)
PHP学习笔记 - 进阶篇(4) 字符串操作 字符串介绍 PHP开发中,我们遇到最多的可能就是字符串. 字符串变量用于包含字符串的值. 一个字符串 通过下面的3种方法来定义: 1.单引号 2.双引号 ...
- PHP学习笔记 - 进阶篇(3)
PHP学习笔记 - 进阶篇(3) 类与面向对象 1.类和对象 类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字.轮胎.速度.重量 ...
- PHP学习笔记 - 进阶篇(2)
PHP学习笔记 - 进阶篇(2) 函数 1.自定义函数 PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一 ...
随机推荐
- Java中==和equals方法
Java程序中测试两个变量是否相等有两种方式:1.== :2.equals()方法 当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是基本数值类型(不一定要求数据类型严格相同),则 ...
- Vue 组件&组件之间的通信 之 父组件向子组件传值
父组件向子组件传值:父组件通过属性向下传值的方式和子组件通信: 使用步骤: 定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: 准备获取数据:com-b要获取父组件dat ...
- xlrd & xlwd
一.安装xlrd http://pypi.python.org/pypi/xlrd 二.使用介绍 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open ...
- dell-7559安装deepin15.8
这大概是我第三次尝试安装deepin了,上一次是显卡问题解决不了,这一次迷迷糊糊问题就解决了. 但是也是尝试了三五十次开机吧233333. 最终是EFI启动,grub引导deepin和win7. 我是 ...
- 本地Git仓库和Github仓库的关联
1.我们首先创建一个文件夹(用于保存本地仓) 在我们想要创建的路径下右键鼠标打开Git Bash Here(创建一个文件夹,并进入文件夹) 2.通过命令git init把我们刚才创建的文件夹变成Git ...
- 踩坑之路---JWT验证
使用JWT验证客户的携带的token 客户端在请求接口时,需要在request的head中携带一个token令牌 服务器拿到这个token解析获取用户资源,这里的资源是非重要的用户信息 目前我的理解, ...
- 对Activity的DecorView的包装(二)
看了下公司的系统代码对于根布局decor_layout.xml的修改, 有所获. 前些时候才开始做系统开发的时候, 总想改改系统的源码, 至于原因: 人总是想装装, 在踩过几个别人修改的坑后, 还是觉 ...
- centos设置网卡开机自启动
1.进入目录/etc/sysconfig/network-scripts/2.修改ifcfg-enxxxxxxxx 文件 (即你的网卡标识命名的配置文件)3. 将ONBOOT=no改成yes4. ...
- GreenDao教程2
总述: 所有的增删改查都需要通过greendao通过实体对象类生成的Dao来实现, 具体实现如下图 1.初始化数据库操作对象(GreenDao自动生成的操作对象) 2.通过数据库操作对象,进行增删改查 ...
- export ,export default 和 import 区别 以及用法
首先要知道export,import ,export default是什么 ES6模块主要有两个功能:export和importexport用于对外输出本模块(一个文件可以理解为一个模块)变量的接口i ...