C++多态实现方式详情

:文章转自公众号:Coder梁(ID:Coder_LT)

在我们之前介绍的继承的情况当中,派生类调用基类的方法都是不做任何改动的调用。

但有的时候会有一些特殊的情况,我们会希望同一个方法在不同的派生类当中的行为是不同的。举个简单的例子,比如speak方法,在不同的类当中的实现肯定是不同的。如果是Human类,就是正常的说话,如果是Dog类可能是汪汪,而Cat类则是喵喵。

在这种情况下只是简单地使用继承是无法满足我们的要求的,最好能够有一个机制可以让方法有多种形态,不同的对象去调用的逻辑不同。这样的行为称为多态。

这里稍微强调一下,多态是一种面向对象的设计思路,本身和C++不是强绑定的,其他语言当中一样有多态,只不过实现的方式可能有所不同。

在C++当中有两种重要的机制用于实现多态:

  • 在派生类当中重新定义基类的方法
  • 使用虚方法

我们来看一个例子:

class Mammal {
 private:
  string name;
 public:
  Mammal(string n): name(n) {}
     string Name() const{
            return name;
        }
  virtual void speak() const {
   cout << "can't say anything" << endl;
  }
     virtual ~Mammal() {};
};

class Human : public Mammal{
 private:
  string job;
 public:
  Human(string n, string j): Mammal(n), job(j) {}
  virtual void speak() const {
   cout << "i'm human" << endl;
  }
};

由于示例比较简单,所以我们把类的声明和实现写在一起了。

从结构上来看,这就是一个简单的继承,我们实现了两个类,一个叫做Mammal,一个叫做Human,然后给它们各自定义了一些成员变量。

值得注意的是speak函数,我们在函数声明前面加上了一个关键字virtual,这表示这是一个虚函数。

方法被定义成虚方法之后,在程序执行的时候,将会根据派生类的类型来选择执行的方法版本。在进行调用的时候,程序是根据对象类型而不是引用和指针的类型来选择执行的方法,

如:

Mammal *m = new Human("man", "spiderman");
m->speak();

这里我们用一个Mammal的指针指向了一个Human类型的对象,当我们调用方法的时候,由于speak方法是一个虚方法。因此执行的时候程序会根据对象的类型也就是Human去执行Human对象中的speak方法,而不是Mammal中的。

通常我们会将析构函数也设置成虚方法,因为派生类当中往往有一些专属成员,这是一种惯例。因为如果析构函数不是虚函数,那么只会调用对应指针类型的析构函数,这意味着可能在一些情况下产生错误和问题。

在上述的示例当中,我们是将类方法的实现和声明写在一起了,如果还是采取和之前一样分开实现的方式,需要注意我们无需在函数签名中加上virtual关键字。

到此这篇关于C++多态实现方式详情的文章就介绍到这了,更多相关C++多态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中的多态详谈

    1. 多态概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态. 举个栗子:比如买票,当普通人买票时,是全价买票:学生买票时,是半价买票:军人买票时是优先买票.同一个事情针对不同的人或情况有不同的结果或形态. 2. 多态的定义及实现 2.1 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为.比如Student继承了Person. Person对象买票全价,Student对象买票半价. 注意:那么在继

  • 详解C++ 多态的两种形式(静态、动态)

    1.多态的概念与分类 多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征.多态字面意思为多种状态.在面向对象语言中,一个接口,多种实现即为多态.C++中的多态性具体体现在编译和运行两个阶段.编译时多态是静态多态,在编译时就可以确定使用的接口.运行时多态是动态多态,具体引用的接口在运行时才能确定. 静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的.静态多态是指在编译期间就可以确定函数的调用地址,

  • C/C++使用C语言实现多态

    目录 1.多态的概念 1.1什么是多态? 1.2为什么要用多态呢? 1.3多态有什么好处? 2.多态的定义及实现 2.1继承中构成多态的条件 2.2虚函数 2.3虚函数的重写 2.4C++11 override 和 final 2.5 重载.覆盖(重写).隐藏(重定义)的对比 3.抽象类 3.1概念 3.2实现继承和接口继承 4.多态的原理 4.1虚函数表 4.2多态的原理 4.3 动态绑定与静态绑定 5.单继承和多继承关系的虚函数表 5.1 单继承中的虚函数表 5.2 多继承中的虚函数表 总结

  • C++类和对象之多态详解

    目录 多态基本概念和原理剖析 多态案例1 计算器类 纯虚函数和抽象类 多态案例2 制作饮品 虚析构和纯虚析构 多态案例3 电脑组装 多态基本概念和原理剖析 多态:多态是C++面向对象的三大特性之一.多态分为静态多态和动态多态. 静态多态:函数重载和运算符重载属于静态多态,复用函数名. 动态多态:派生类和虚函数实现运行时多态. 区别: 静态多态的函数地址早绑定,编译阶段确定函数地址. 动态多态的函数地址晚绑定,运行阶段确定函数地址. #include <iostream> using names

  • C/C++中多态性详解及其作用介绍

    目录 概述 静态多态 函数重载 运算符重载 动态多态 非动态 动态 概述 多态性 (polymorphism) 是面向对象程序设计的一个重要特征. 利用多态性扩展设计和实现一个易于扩展的系统. C++ 中多态性: 同一函数名可以实现不同的功能 用一个函数名调用不同内容的函数完成不同的工作 静态多态 静态多态 (static polymorphism) 是通过函数的重载实现的, 包括函数的重载和运算符重载. 在程序编译时系统就能觉得调用哪个函数. 函数重载 int main() { cout <<

  • 一篇文章带你了解C++多态的实现原理

    目录 虚函数和多态 多态的作用 多态的一个例子 构造函数和析构函数中存在多态吗? 多态的实现原理 虚函数表 虚析构函数 纯虚函数和抽象类 总结 虚函数和多态 虚函数: 在类的定义中,前面有 virtual 关键字的成员函数称为虚函数 virtual 关键字只用在类定义里的函数声明中,写函数体时不用 比如: class Base { virtual int Fun() ; // 虚函数 }; int Base::Fun() // virtual 字段不用在函数体时定义 { } 多态的表现形式 派生

  • 虚函数表-C++多态的实现原理解析

    参考:http://c.biancheng.net/view/267.html 1.说明 我们都知道多态指的是父类的指针在运行中指向子类,那么它的实现原理是什么呢?答案是虚函数表 在 关于virtual 一文中,我们详细了解了C++多态的使用方式,我们知道没有 virtual 关键子就没法使用多态 2.虚函数表 我们看一下下面的代码 class A { public: int i; virtual void func() { cout << "A func" <<

  • C++数据结构分析多态的实现与原理及抽象类

    目录 多态的 概念 虚函数 多态构成的条件 C++11override和final 重载.重写和重定义(隐藏) 抽象类 多态的原理

  • C++中多态的定义及实现详解

    1. 多态概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态. 举个栗子:比如买票,当普通人买票时,是全价买票:学生买票时,是半价买票:军人买票时是优先买票.同一个事情针对不同的人或情况有不同的结果或形态. 2. 多态的定义及实现 2.1 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为.比如Student继承了Person. Person对象买票全价,Student对象买票半价. 注意:那么在继

  • C++多态实现方式详情

    注:文章转自公众号:Coder梁(ID:Coder_LT) 在我们之前介绍的继承的情况当中,派生类调用基类的方法都是不做任何改动的调用. 但有的时候会有一些特殊的情况,我们会希望同一个方法在不同的派生类当中的行为是不同的.举个简单的例子,比如speak方法,在不同的类当中的实现肯定是不同的.如果是Human类,就是正常的说话,如果是Dog类可能是汪汪,而Cat类则是喵喵. 在这种情况下只是简单地使用继承是无法满足我们的要求的,最好能够有一个机制可以让方法有多种形态,不同的对象去调用的逻辑不同.这

  • 深入php多态的实现详解

    多态性是指相同的操作或函数.过程可作用于多种类型的对象上并获得不同的结果.不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性. 多态性允许每个对象以适合自身的方式去响应共同的消息.多态性增强了软件的灵活性和重用性. 在面向对象的软件开发中,多态性是最为重要的部分之一.面向对象编程并不只是将相关的方法与数据简单的结合起来,而是采用面向对象编程中的各种要素将现实生活中的各种情况清晰的描述出来.这一小节将对面向对象编程中的多态性作详细的讲解. 1.什么是多态 多 态(Polymorphi

  • 详解C++值多态中的传统多态与类型擦除

    引言 我有一个显示屏模块: 模块上有一个128*64的单色显示屏,一个单片机(B)控制它显示的内容.单片机的I²C总线通过四边上的排针排母连接到其他单片机(A)上,A给B发送指令,B绘图. B可以向屏幕逐字节发送显示数据,但是不能读取,所以程序中必须设置显存.一帧需要1024字节,但是单片机B只有512字节内存,其中只有256字节可以分配为显存.解决这个问题的方法是在B的程序中把显示屏分成4个区域,保存所有要绘制的图形的信息,每次在256字节中绘制1/4屏,分批绘制.发送. 简而言之,我需要维护

  • C++利用多态实现职工管理系统(项目开发)

    分析 首先看一下这个项目的文件: 主要分为两部分: 主体部分: main.cpp和workManager.h,workManager.cpp职工部分(这里采用多态的方式编写): 主要是worker.h和worker.cpp 三种职位:boss,employee,manager 经过分析是否大概知道了其中各部分的意思呢? 看起来这里面有很多,但是正是这种多个文件编写才时代码更加简洁. 所以在正式写项目之前一定要先考虑好整体架构,在进行编写. 项目整体架构: 这个项目的难度并不大,主要是要学会这个项

  • Java抽象类、继承及多态和适配器的实现代码

    Java继承 方法重写是Java语言多态的特性,必须满足以下条件 在子类中,方法名称与父类方法名称完全相同 方法的参数个数和类型完全相同,返回类型完全相同 方法的访问修饰符访问级别不低于父类同名方法的访问级别 在方法上添加@override注释,如果报错说明不是重写 方法重写限制 final修饰的父类方法在子类中不能被重写 static修饰的父类方法在子类中不能被重写,只能覆盖 super关键字 super关键字和this类似,super修饰的是父类的对象,如super();调用的是父类的默认无

  • Java语法之 Java 的多态、抽象类和接口

    目录 一.多态 1. 向上转型 2. 动态绑定 3. 方法重写 4. 向下转型 5. 关键字 super 6. 在构造方法中调用重写方法(坑) 7. 理解多态 8. 小结 二.抽象类 1. 概念 2. 注意事项 3. 抽象类的意义 3. 抽象类的作用 三.接口 1. 语法规则 2. 实现多个接口 3. 接口的继承 4. Comparable 接口 4. Comparator 接口 5. Cloneable 接口和深拷贝 上一篇文章:Java 基础语法之解析 Java 的包和继承 今天这章主要介绍

  • C++的多态与虚函数你了解吗

    目录 多态性 虚函数 总结 多态性 多态性是面向对象程序设计的关键技术之一,若程序设计语言不支持多态性,不能称为面向对象的语言,利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能 在C++中有两种多态性: 编译时的多态 通过函数的重载和运算符的重载来实现的 运行时的多态性 运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定:它是通过类继承关系public和虚函数来实现的,目的也是建立一种通用的程序:通用性是

  • C++ 超详细分析多态的原理与实现

    目录 多态的定义及实现 多态的构成条件 虚函数重写 C++11的override和final 抽象类 多态的原理 虚函数表 动态绑定与静态绑定 单继承和多继承关系的虚函数表 单继承中的虚函数表 多继承中的虚函数表 常见问题 多态的定义及实现 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态. 比如买票这个行为,当普通人买票时,是全价买票:学生买票时,是半价买票:军人买票时是优先买票. 多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • Ruby的语法和语言特性总结

    Ruby是一种解释型.面向对象.动态类型的语言.Ruby采取的策略是在灵活性和运行时安全之间寻找平衡点.随着Rails框架的出现,Ruby也在2006年前后一鸣惊人,同时也指引人们重新找回编程乐趣.尽管从执行速度上说,Ruby谈不上有多高效,但它却能让程序员的编程效率大幅提高.本文将讲述Ruby语言的基础语言特性,包括基本的语法及代码块和类的定义. 1. 基础 在Ruby交互命令行中输入以下命令(>>为命令行提示符,=>为返回值:下文将把=>符号和语句写在一行内表明其返回值): &

随机推荐