关于多态(polymorphism)的初步知识(此处指动态多态)

2024-02-06 16:18

本文主要是介绍关于多态(polymorphism)的初步知识(此处指动态多态),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
using namespace std;class Human
{
public:virtual void eat(){cout << "Human: virtual void eat()" << endl;}void sleep() // 非虚函数,不具有多态性{cout << "Human: void sleep()" << endl;}
};class Man : public Human
{
public:virtual void eat() // 此处的virtual可省略,但最好不要省略{cout << "Man: virtual void eat()" << endl;}void sleep(){cout << "Man: void sleep()" << endl;}
};int main()
{Human *p, h;Man m;p = &h;p->eat();p->sleep();p = &m;p->eat();p->sleep();return 0;
}

      结果为:

Human: virtual void eat()
Human: void sleep()
Man: virtual void eat()
Human: void sleep()
 

      多态(动态多态)条件:1. 发生在基类和派生类之间;2.都是虚函数;3.函数首部要相同(注意:如果返回值类型不同,则会报错啊,我以前不知道这一点,还以为即使返回值不一样,也可以通过晚绑定来实现多态呢!)。

      上面的程序也可以改成引用形式:

 

#include <iostream>
using namespace std;class Human
{
public:virtual void eat(){cout << "Human: virtual void eat()" << endl;}void sleep() // 非虚函数,不具有多态性{cout << "Human: void sleep()" << endl;}
};class Man : public Human
{
public:virtual void eat() // 此处的virtual可省略,但最好不要省略{cout << "Man: virtual void eat()" << endl;}void sleep(){cout << "Man: void sleep()" << endl;}
};void testEat(Human & b)
{b.eat();
}void testSleep(Human & b)
{b.sleep();
}int main()
{Human h;Man m;testEat(h);testSleep(h);testEat(m);testSleep(m);return 0;
}

 

    结果为指针形式的结果一样。在下面的讨论中,我们采用指针的形式,继续看程序:

 

#include <iostream>
using namespace std;class Human
{
public:virtual void eat(){cout << "Human: virtual void eat()" << endl;}
};class Man : public Human
{
public:// error C2555: 'Man::eat' : overriding virtual function differs // from 'Human::eat' only by return type or calling conventionvirtual int eat(){cout << "Man: virtual int eat()" << endl;}
};int main()
{Human *p, h;Man m;p = &h;p->eat();p = &m;p->eat();return 0;
}

     由上面的程序可知,仅仅返回值不同,会报错啊(我以前以为这样也可以有多态性呢)。继续看:

#include <iostream>
using namespace std;class Human
{
public:virtual void eat(int a){cout << "Human: virtual void eat(int a)" << endl;}
};class Man : public Human
{
public:virtual void eat(float a) // 不具有多态性{cout << "Man: virtual void eat(float a)" << endl;}
};int main()
{Human *p, h;Man m;p = &h;p->eat(1);p = &m;p->eat(1);return 0;
}

     结果为:

 

Human: virtual void eat(int a)
Human: virtual void eat(int a)

     现在,总该对多态有基本的认识了吧。

 

这篇关于关于多态(polymorphism)的初步知识(此处指动态多态)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684859

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

初步学习Android的感想

之前在学习java语言的时候就经常听说过Android这门语言,那时候感觉Android有些神秘感,再加上Android是用来开发移动设备的一门语言,所以一直对Android抱有一种兴奋的心情。 在我开始接触 Android之后,感觉超好玩,因为可以在自己的手机设备上开发一些我喜欢的小应用,再想想之前说学习Android应该会很难,但是如果你真的接触了,而且有JAVA的功底,我想学习Androi