C++实现多态的条件
一.C++实现多态的条件
1.派生类对象必须赋值给基类的引用或者指向基类的指针。
2.派生类的继承方式必须是公有继承public。
如果是protected继承或者是private继承,那么子类的所有方法只能在内部访问,这时候就不需要多态了。一般会有语法报错。
3.基类中的同名函数必须定义为虚函数。
举个例子:
#include<iostream>
using namespace std;
int main()
{class B { public: virtual void f() { cout << "我是B" << endl; }; };class P :public B { public:void f() { cout << "我是P" << endl; } };class Q :public B { public:void f() { cout << "我是Q" << endl; } };P p;Q q;B b1 = p; //这种情况只能是调用父类的函数b1.f();B& b2= p;b2.f();B& b3 = q;b3.f();
}
运行结果:
二.关于虚函数使用的几点注意规则
1.必须首先在基类中声明虚函数。在多继承的情况下,也可以不在最高层的基类中声明虚函数。
例如在第二层定义的虚函数,可以和第三层的虚函数形成动态联编,但是,一般都是在最高层的基类中首先声明虚函数。
2.基类和派生类的同名函数,函数名,返回值,参数表必须全部相同,才能作为虚函数来使用。
否则即使用virtucal来说明,也不具有虚函数的行为。
3.虚函数不可以是静态成员函数,构造函数也不可以是虚函数。
因为虚函数的调用需要虚表,虚表又由构造函数建立。
4.析构函数可以声明为虚函数,可以定义虚析构函数。
5.在多继承中,最高层和第三层有两个原型相同的函数,并且在最高层声明为虚函数,则第三层的这个函数也是虚函数。
这种关系并不会因为第二层没有定义这个函数而受影响。
三.补充几点虚函数和纯虚函数
1.虚函数是为了实现多态服务的。
有虚函数的类,可以被实例化,但是虚函数必须实现(有函数体,里面有什么不要紧)这个很好理解,类中的函数没有实现编译时候会报错。
2.纯虚函数是为了抽象类服务的。而抽象类作用是为了灵活规范子类以及多态。
有纯虚函数的类无法实例化,即抽象类无法被实例化。
纯虚函数必须在子类当中被实现,否则该子类也只能是抽象类。
附上几道试题:
https://www.nowcoder.com/questionTerminal/81c3e33a2f834b168487c22e85a85b0f
https://www.nowcoder.com/questionTerminal/a6d17dac54c64d4f8712c578ef5d2dc3?toCommentId=1240609
C++实现多态的条件相关推荐
- 必会重构技巧:使用多态替换条件
使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象 举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型 ...
- 重构——39以多态取代条件表达式(Replace Conditional with Polymorphism)
以多态取代条件表达式(Replace Conditional with Polymorphism) 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为:将这个条件表达式的每个分支放进一个子类内 ...
- 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand{Start,Stop} 当前该枚举存在两个命 ...
- js 使用多态替换条件语句_用多态和组成替换多个条件
js 使用多态替换条件语句 用多态替换条件语句是一种众所周知的重构模式. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些 ...
- 重构手法——提炼函数、搬移函数、以多态取代条件表达式
目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...
- 用多态和组合替换多个条件
这是一种众所周知的重构模式,可以将条件条件替换为多态性. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦该类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些有关如何使用这 ...
- 【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理
多态 1. 多态 2. 多态的定义和实现 2.1 多态的条件 2.2 虚函数重写的两个例外 2.2.1 协变 2.2.2 析构函数的重写 2.3 只有父类带 virtual 的情况 2.4 C++11 ...
- 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)
系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...
- Swift学习 OOP三大特性:继承、多态、封装
先看个例子 从上面的例子可以总结那么一句话:"学生是人".也就是Student类继承People类.简而言之,学生是人,这句话是说得通的,但是"人是学生"这句 ...
最新文章
- Windows 7 部署(一):安装和部署简述
- 在原神里钓鱼,有人竟然用上了深度强化学习,还把它开源了
- 华硕笔记本,宽带连上,可以上网, 但收到不无线
- 前端学习(2034)vue之电商管理系统电商系统之绘制图表
- linux 内网共享文件夹_局域网中实现linux文件共享
- js逆向解析技巧--selenium
- 小米路由插件二维码2020_打造5G时代的AIoT智能互联 小米路由AX3600评测
- apache创建虚拟主机
- php win8环境搭建
- ubuntu如何卸载软件
- 谷歌学术用publish-or-perish来对引用量排序
- 史上最全-常见正则表达式集合
- 国际知名营养品牌排行榜前十位
- 第4章 虚拟机性能监控与故障处理工具
- 再谈UI设计的入门与进阶
- 如何选购计算机硬件,如何选购电脑硬件 选购电脑硬件技巧【详细介绍】
- 修正波逆变器的设计要点
- 依据银行卡号获取银行信息Java代码
- 程序员进阶的一些实用工具
- 【北邮国院大三上】互联网协议_Internet Protocol_PART B