一.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++实现多态的条件相关推荐

  1. 必会重构技巧:使用多态替换条件

    使用多态替换条件:指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象 举例理解:看定义可能比较迷糊,其实说的简单一点,对于使用分支语句并且分支条件是和类型 ...

  2. 重构——39以多态取代条件表达式(Replace Conditional with Polymorphism)

    以多态取代条件表达式(Replace Conditional with Polymorphism) 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为:将这个条件表达式的每个分支放进一个子类内 ...

  3. 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

    建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand{Start,Stop} 当前该枚举存在两个命 ...

  4. js 使用多态替换条件语句_用多态和组成替换多个条件

    js 使用多态替换条件语句 用多态替换条件语句是一种众所周知的重构模式. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些 ...

  5. 重构手法——提炼函数、搬移函数、以多态取代条件表达式

    目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...

  6. 用多态和组合替换多个条件

    这是一种众所周知的重构模式,可以将条件条件替换为多态性. 如果您不熟悉该模式,可以在此处查看 . 但是,一旦该类中有多个条件检查所基于的字段,该基本解决方案便会开始崩溃. 我们将研究一些有关如何使用这 ...

  7. 【C++】多态 —— 条件 | 虚函数重写 | 抽象类 | 多态的原理

    多态 1. 多态 2. 多态的定义和实现 2.1 多态的条件 2.2 虚函数重写的两个例外 2.2.1 协变 2.2.2 析构函数的重写 2.3 只有父类带 virtual 的情况 2.4 C++11 ...

  8. 改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions)

    系列博客 1. 改善代码设计 -- 优化函数的构成(Composing Methods) 2. 改善代码设计 -- 优化物件之间的特性(Moving Features Between Objects) ...

  9. Swift学习 OOP三大特性:继承、多态、封装

    先看个例子  从上面的例子可以总结那么一句话:"学生是人".也就是Student类继承People类.简而言之,学生是人,这句话是说得通的,但是"人是学生"这句 ...

最新文章

  1. Windows 7 部署(一):安装和部署简述
  2. 在原神里钓鱼,有人竟然用上了深度强化学习,还把它开源了
  3. 华硕笔记本,宽带连上,可以上网, 但收到不无线
  4. 前端学习(2034)vue之电商管理系统电商系统之绘制图表
  5. linux 内网共享文件夹_局域网中实现linux文件共享
  6. js逆向解析技巧--selenium
  7. 小米路由插件二维码2020_打造5G时代的AIoT智能互联 小米路由AX3600评测
  8. apache创建虚拟主机
  9. php win8环境搭建
  10. ubuntu如何卸载软件
  11. 谷歌学术用publish-or-perish来对引用量排序
  12. 史上最全-常见正则表达式集合
  13. 国际知名营养品牌排行榜前十位
  14. 第4章 虚拟机性能监控与故障处理工具
  15. 再谈UI设计的入门与进阶
  16. 如何选购计算机硬件,如何选购电脑硬件 选购电脑硬件技巧【详细介绍】
  17. 修正波逆变器的设计要点
  18. 依据银行卡号获取银行信息Java代码
  19. 程序员进阶的一些实用工具
  20. 【北邮国院大三上】互联网协议_Internet Protocol_PART B

热门文章

  1. 完美解决前端无法上传大文件方法
  2. 形态学操作——开运算与闭运算
  3. 实验四、SPOOLing技术
  4. spooling技术和通道及实现打印机共享
  5. 【python】Flask
  6. SQL中PIVOT的用法
  7. getContextPath方法
  8. 二进制文件在linux如何表示,如何通过静态分析找出二进制文件是否在Linux上使用某些系统调用?...
  9. 什么是disjoint-support?
  10. 10个月时间,CMO如何挽救这家破产的电商巨头?