首页 > 其他分享 >OOP笔记 —— 多态(Polymorphism)

OOP笔记 —— 多态(Polymorphism)

时间:2024-05-26 14:02:17浏览次数:13  
标签:Polymorphism 函数 实现 派生类 多态 纯虚 基类 OOP

多态就是同一个方法的不同实现(即:相同的函数名,不同的函数体)

多态的精髓在于父类指针的使用:将子类的地址赋给父类指针,即父类指针指向子类对象

注意:用指针去调用成员方法时,通过“->”符号

1. 虚函数(Virtual Function)

此处的虚函数是指非纯虚函数。

  • 定义:非纯虚函数是一个带有 virtual 关键字的成员函数,但它在基类中有一个实现。
  • 继承:派生类可以选择重写(override)这个虚函数,也可以不重写。如果不重写,则会继承基类的实现。
  • 多态性:使用基类指针或引用调用这个函数时,会根据实际指向的对象类型,调用相应的版本(基类版本或派生类版本)。
  • 实现要求:虚函数(非纯虚函数)的基类必须提供这个函数的实现【和纯虚函数相反】。

使用虚函数的目的:该函数具有不同的实现方式,通过虚函数及指针的使用,实现运行时多态(runtime polymorphism),也叫动态绑定。意思是,通过父类指针指向子类对象,如果该子类对象有自己的函数实现方式,则执行自己的实现方式;若没有,则执行离它最近的、有该函数的父类的实现方式。【Virtual function allows you to execute the most derived version of this function when it is invoked using a base class pointer.

class Instrument {
public:
    virtual void makeSound(){
        cout<<"Instrument playing..."<<endl;
    }
};

class Accordion : public Instrument {
public:
    void makeSound() override{
        cout<<"Accordion playing..."<<endl;
    }
};


int main() {
    Instrument * i1 = new Accordion();
    i1->makeSound(); // 输出结果为Accordion playing...

    return 0;
}

2. 纯虚函数与抽象类(Pure Virtual Function & Abstract Class)

  • 定义:纯虚函数在基类中声明,但不提供实现,使用 = 0 来表示这是一个纯虚函数。
  • 继承:所有派生类必须提供这个纯虚函数的实现,否则派生类也将成为抽象类,不能实例化。
  • 多态性:使用基类指针或引用调用这个函数时,会根据实际指向的对象类型调用相应的版本。
  • 实现要求:基类不提供实现,只是定义接口,具体实现由派生类提供。

使用纯虚函数的目的:父类不提供函数的实现方式,交给它的所有子类去执行各自的实现方式。【Pure Virtual Function forces all of its derived classes to implement their own version of that function.】

抽象类:只要class中有了一个纯虚函数,那这个class就是抽象类。

class Instrument {
public:
    virtual void makeSound() = 0; //纯虚函数的形式(=0),没有函数体
};

class Accordion : public Instrument {
public:
    void makeSound() override{
        cout<<"Accordion playing..."<<endl;
    }
};

class Piano : public Instrument {
public:
    void makeSound() override{
        cout<<"Piano playing..."<<endl;
    }
};

使用纯虚函数实现多态:用同一个代码去执行不同的函数

int main() {
    Instrument * i1 = new Accordion();
    Instrument * i2 = new Piano();

    Instrument * instrument[2] = {i1,i2}; //创建存放该class类型的指针数组
    for(int i =0; i<2; i++) {
        instrument[i]->makeSound();
    } //通过一个for循环,实现了多态, 省略了i1->makeSound()、i2->makeSound()这些重复代码

    for(int i =0; i<2; i++) {
        delete instrument[i]; // delete 操作符释放动态分配的内存
        instrument[i] = nullptr;  // delete之后将指针设置为nullptr虽然不是必须的,但这是一种很
                                     好的编程习惯
    }

    return 0;
}

3. 【小结】实现多态的2个注意事项

① 所有的派生类有一个共同基类,这个基类有一个虚函数可以被所有类调用

  • 非纯虚函数:基类必须提供一个默认实现,派生类可以选择是否重写。
  • 纯虚函数:基类没有实现,所有派生类必须提供自己的实现,除非派生类本身也被定义为抽象类。

② 实现多态的方法

实现多态的关键在于使用基类指针或引用来调用派生类对象的虚函数,从而实现动态绑定(也称为运行时多态)。

使用一个基类指针数组来存储不同派生类对象的地址是一种常见的实现方式(上例)。

标签:Polymorphism,函数,实现,派生类,多态,纯虚,基类,OOP
From: https://blog.csdn.net/2301_78916684/article/details/139210176

相关文章

  • Hadoop创建文件、上传文件、下载文件、修改文件名、删除文件精细全流程
    目录一、起步流程1.创建配置参数对象---Configuration类(org.apache.hadoop.conf.Configuration)2.通过配置参数对象指定hdfs的地址3.创建HDFS文件系统的对象---带配置项---FileSystem类​二、具体操作(1)创建目录:/wordcount(2)下载文件:/data/input/word.txt下载到D:/hadoop......
  • Hadoop 学习
    Hadoop三种运行模式:1.本地模式(学习)1.没有HDFS,使用当前系统下的文件系统2.没有YARN,使用的是Linux中的资源3.使用了Map-ReduceFramework2.伪分布式模式(学习)1.只有单台机器2.使用HDFS、Yarn、MapReduce3.分布式模式(企业级)1.多台服务器2.集群模式,包含整......
  • Processing 009 一个复杂点的例子,OOP实现屏幕碰撞小球
    Processing009一个复杂点的例子,OOP实现屏幕碰撞小球1processing中的面向对象编程基本上和java的语法一致,例如classCar{ Stringname; intprice; publicCar(Stringname,intprice){ this.name=name; this.price=price; } publicvoidprintInfo......
  • 大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了
    (实验一搭建hadoop伪分布式)--------------------------------------------------------------------------------------------------------------------------------一、实验目的1.理解Hadoop伪分布式的安装过程实验内容涉及Hadoop平台的搭建和配置,旨在提高对大数据处理框......
  • VMware上基于centos系统完全分布式Hadoop集群的搭建详解
    目录1.centos系统的环境的准备1.1.样本机的配置1.1.1.准备一个centos的虚拟机1.1.2.关闭系统的防火墙1.1.3.配置centos系统的IP1.1.4.修改主机名称1.1.5. 配置hosts映射文件1.2.jdk的安装1.2.1.jdk的下载1.2.2.虚拟机自带jdk的删除1.2.3.将jdk上传到虚拟机中1.2.4......
  • 多态性
    定义一个shape抽象类,派生出rectangle类和circle类,计算各类派生类对象的面积area().#include<iostream>usingnamespacestd;classshape{public:virtualdoublearea()=0;};classrectangle:publicshape{public:rectangle(doublew,......
  • 深入理解C++多态-虚函数
    引言C++多态的实现方式可以分为静态多态和动态多态,其中静态多态主要有函数重装和模板两种方式,动态多态就是虚函数。下面我们将通过解答以下几个问题的方式来深入理解虚函数的原理:为什么要引入虚函数?(用来解决什么问题)虚函数底层实现原理使用虚函数时需要注意什么?正文......
  • 4/25虾皮面试准备 Hadoop疑难杂症
    namenode元信息   小文件  容量队列      HadoopHAzkfc究竟是什么监视器和https://www.cnblogs.com/yjt1993/p/9492102.html 没有secondnode了!高可用因为standby代替了      Hadoop调优细节   ......
  • Hadoop集群启动与关闭
    启动集群点击查看代码[root@master~]#start-all.shStartingnamenodeson[master]StartingdatanodesStartingsecondarynamenodes[master]StartingresourcemanagerStartingnodemanagers!可以在master执行hive命令直接启动hive,无需在提供服务的clone1上首先启动......
  • scoop 使用
    Scoop官网ScoopInstaller/Scoop|GitHubSet-ExecutionPolicyRemoteSigned-ScopeCurrentUser#Optional:Neededtorunaremotescriptthefirsttimeirmget.scoop.sh|iexscoopbucketaddextras#增加extras软件源scoopinstallpasteboard#安装软件......