C++五:重载与多态

一:概述

  多态是指同样的消息被不同类型的对象接收导致不同的行为,即接口的多种不同的实现方式。多态可分为静态多态与动态多态。多态类型可分为四类:重载多态,强制多态,包含多态,参数多态。

二:实现

1.重载多态(运算符重载)

  运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据是有不同的行为。其实质就是函数重载。运算符重载可分为重载为类的非静态成员函数与重载为非成员函数。

1.1 重载为类的非静态成员函数

  使用关键字operator 运算符,即可根据你给出的标志符,自动选择对应的函数。

例如;

#include <iostream>
using namespace std;
class Complex //复数类定义
{
public: // 外部接口
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}
Complex operator+(const Complex &c2)const;//定义一个+的重载函数
Complex operator-(const Complex &c2)const;//定义一个-的重载函数
void display()const;
private:
double real;
double imag; };
Complex Complex::operator+(const Complex &c2)const {
return Complex(real + c2.real, imag + c2.imag);//返回两个值的和
}
Complex Complex::operator-(const Complex &c2)const {
return Complex(real - c2.real, imag - c2.imag);//返回两个值的差
}
void Complex::display()const {
cout << "(" << real << "," << imag << ")" << endl;
}
int main() {
Complex c1(5, 4), c2(2, 10), c3;
cout << "c1=";
c1.display();
cout << "c2=";
c2.display();
c3 = c1 + c2;
cout << "c3=c1+c2=";
c3.display();
c3 = c1 - c2;
cout << "c3=c1-c2=";
c3.display();
return 0;
}

运行结果为:



可以看到,在main函数中,c3根据c1与c2的不同操作,自动选择了对应的函数。

1.2 重载为非成员函数

  将运算符重载为类的非成员函数,就必须把操作数全部通过形参的方式传递给运算符重载函数。

例如:

2.虚函数

  虚函数是动态绑定的基础。虚函数必须是非静态的成员函数。虚函数必须用virtual关键字特别声明。派生类的函数和基类的虚函数一样时,派生类中的函数也会被默认为虚函数。

2.1虚析构函数

  在c++中,虚构函数可以通过基类指针删除派生类对象,而不能声明虚构造函数,但是可以生成虚析构函数,只需声明为

virtual ~类名();

例如:

C++五:重载 多态的更多相关文章

  1. C++继承-重载-多态-虚函数

    C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: ...

  2. python面向对象学习(五)多态

    多态 多态:不同的 子类对象 调用相同的 父类方法,产生不同的执行结果 多态 可以 增加代码的灵活度 以 继承 和 重写父类方法 为前提 是调用方法的技巧,不会影响到类的内部设计 多态案例练习 需求 ...

  3. C++ 类的多态五(多态的语法本质分析)

    //多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...

  4. [java核心技术01]__继承与多态、重载与重写、抽象类与接口

    前言 前面简单学习了面向对象的知识,知道了其两个重要的特性,继承与多态,今天就围绕着面向对象的这两个特性,将继承与多态及相关的几个几个定义重载与重写,抽象类与接口的相关知识具体学习一下. 类的继承 关 ...

  5. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  6. Java 学习(12):重写(Override)与重载(Overload) & 多态

    目录 --- 重写 --- 重载 --- 多态 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可 ...

  7. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  8. 深入剖析C++多态、VPTR指针、虚函数表

    在讲多态之前,我们先来说说关于多态的一个基石------类型兼容性原则. 一.背景知识 1.类型兼容性原则 类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代.通过公有继承,派 ...

  9. Java重写、重载与覆盖

    Java继承.重载与重写 一.继承(单继承) 1.利用extends关键字一个方法继承另一个方法,而且只能直接继承一个类. 2.当Sub类和Base类在同一个包时,Sub类继承Base类中的publi ...

随机推荐

  1. win7旗舰版64位搭建FTP服务器

    1.安装IIS组件:点击开始菜单->选择控制面板->程序->打开或关闭WINDOWS功能->展开Internet信息服务,勾选FTP服务器(包括FTP服务和FTP扩展性),展开 ...

  2. memcache 拓展

    需要安装Libevent.memcached.memcache. 参考网址:https://www.cnblogs.com/hejun695/p/5369610.html 启动:/usr/local/ ...

  3. Python3数据分析与挖掘建模实战

    Python3数据分析与挖掘建模实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...

  4. python基础--基础数据类型

    1.输入 python2中的输入: 关键字:input()  --> 需要人为的告诉input你输入的是哪种类型的数据(声明数据类型) >>> name = input('pl ...

  5. linux目录结构详细说明

    Linux各目录及每个目录的详细介绍 [常见目录说明] 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所 ...

  6. day36 10-Hibernate中的事务:解决丢失更新

    演示hibernate如何产生丢失更新的 丢失更新是怎么玩的?首先两个事务先都把它查出来. A事务里面去修改的数据没了,被B事务覆盖掉了.这是被B事务提交覆盖,B事务回滚也能覆盖.这就是丢失更新的效果 ...

  7. vue 项目重定向时需要传参数

    1.在项目首页路由因需要进行传参数,例如需要重定向到:path: "/index?from=0" 2.重定向时写法如下: redirect: {path: '/index',que ...

  8. Django项目:CRM(客户关系管理系统)--05--02PerfectCRM创建ADMIN页面03

    /*! *bootstrap.js * * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. ...

  9. Ajax--同源策略,jsonp跨域传输原理(callback),

    什么是同源策略? 阮一峰的博客 同源策略 同源策略的解决方法: 跨域传输 img 标签的src是可以引入其他域名下的图片 script标签的src属性同理 ,也可以引入其他域名下的js文件,并执行 1 ...

  10. vue中router以及route的使用

    路由基本概念 route,它是一条路由. { path: '/home', component: Home } routes,是一组路由. const routes = [ { path: '/hom ...