C++课程第五次博客——多态

Wesley13
• 阅读 558

[TOC]

多态性

Part1 多态性概述

多态是指同样的消息被不同类型的对象接收时导致不同的行为。在C++中,所谓信息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。

1)多态的类型

分为四类:重载多态,强制多态,包含多态和参数多态。前两者为专用多态,而后者称为通用多态。

2)多态的实现

分为两类:编译时的多态和运行时的多态。

前者是在编译的过程中确定了同名操作的具体操作对象

后者则是在程序运行过程中才多态确定操作所针对的具体对象

这种确定操作的具体对象的过程就是绑定,绑定是指计算机程序自身彼此关联的过程,也就是把一条信息和一个对象相结合的过程。绑定工作在编译连接阶段完成的情况称为静态绑定,例如重载,强制和参数多态。而绑定工作在程序运行阶段完成的情况称为动态绑定,例如多态操作对象的确定通过动态绑定完成。

Part2 多态实验

在多态性中,运算符重载、虚函数、纯虚函数和抽象类是相对来说难以理解的,下面我们主要将对这些知识点,设计实验并探索。

运算符重载

第一注意点

当运算符重载为类的成员函数时,函数的参数个数比原来的操作数个数要少一个(后置“++”,“--”除外)

#include <iostream>
using namespace std;
class fun{
private:
    double x,y;
public:
    fun(double x=0,double y=0):x(x),y(y){};
    fun operator+(const fun &c1,const fun &c2)const;   //当重载函数为重载函数时,传进两个无名对象
    void displat()const;
};

结果编译器直接报错:Overloaded 'operator+' must be a unary or binary operator (has 3 parameters)

当operator+改成只传进一个参数时,编译通过。

原因:类的this指针所指的对象默认穿进去。

虚函数

虚函数是动态绑定的基础。虚函数必须是非静态的成员函数。虚函数经过派生之后,在类族中就可以实现运行过程中的多态

第二注意点:

由成员函数来调用或者是通过指针、引用来访问虚函数

#include <iostream>
using namespace std;
//类的声明和实现
class base1{
public:
    virtual void display()const;        //虚函数
};
void base1::display() const{
    cout<<"Base1::display"<<endl;
}
class base2:public base1{
public:
    void display() const;
};
void base2::display()const{
    cout<<"base2::display"<<endl;
}
class Derived:public base2{
public:
    void display() const;
};
void Derived::display()const{
    cout<<"Derived::display"<<endl;
}
//通过对象名来访问虚函数
int main(){
    base1 base1;
    base2 base2;
    Derived derived;
    base1.display();
    base2.display();
    derived.display();
    return 0;
}

结果输出正确:

C++课程第五次博客——多态

但是用这个方式来访问虚函数,则是绑定在编译过程中,而不是在运行过程中进行。如果要实现多态绑定,需要用指针,使程序更加灵活。

void fun(base1 *ptr){
    ptr->display();
}

纯虚函数和抽象类

带纯虚函数的类是抽象类,抽象类声明了一个类族派生类的共同接口,而接口的完整实现,即纯虚函数的函数体,要由派生类自己定义。

#include <iostream>
using namespace std;
class base1{
public:
    virtual void display()const=0;        //纯虚函数
};
class base2:public base1{
public:
    void display1() const;                                //没有去定义抽象的函数体
};
void base2::display1()const{
    cout<<"base2::display1"<<endl;
}

报错:Out-of-line definition of 'display1' does not match any declaration in 'base2'

将display1修改为display编译通过。

而且在程序中的虚函数并没有用virtual关键字显性声明,二是编译器通过派生类有着与抽象基类的纯虚函数相同的名称、参数以及返回值,来自动确定其为虚函数。

Part3 总结

通过定义同一名称操作,当面对不同数据时实现不同的功能。使程序的功能实现更加灵活。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
小万哥 小万哥
11个月前
C++虚函数详解:多态性实现原理及其在面向对象编程中的应用
在面向对象的编程中,多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时,可以产生不同的行为。C是一种面向对象的编程语言,在C中,虚函数是实现多态性的关键什么是虚函数虚函数是一个在基类中声明的函数,它可以被子类重写并提供不同的实现
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
C++多态性总结
一,C多态性概述多态是指同样的消息被不同类型的对象接受时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就调用不同的函数。换言之,多态指的就是用同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。二,多态性分类!在这里插入图片描述(https://osc
Wesley13 Wesley13
2年前
C++多态性与虚函数
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。(一)多态性  多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这