首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 play() 方法,在代码的第35-37行,创建一个父类指针,然后将子类地址引用赋值给父类,这时调用 P 指针的 play() 方法会打印出什么呢。开始我以为会是调用子类的 play() 方法,因为第36行给引用了,但打印结果是:

  这是个父类的play

 1 #include <iostream>
2
3 class Father
4 {
5 public:
6 void play()
7 {
8 std::cout << "这是个父类的play" << std::endl;
9 }
10 };
11
12 class Son : public Father
13 {
14 public:
15 void play()
16 {
17 std::cout << "这是个子类的Play" << std::endl;
18 }
19 };
20
21
22 void party(Father** men, int num)
23 {
24 for (int i = 0; i < num; i++)
25 {
26 men[i]->play();
27 }
28 }
29
30 int main()
31 {
32 Father father;
33 Son son;
34
35 Father* p; //定义一个父类的指针 P
36 p = &son; //指针引用子类地址
37 p->play(); //访问指针中的 play() 方法,访问的会是子类的 play() 么?
38
39 }

通过父类的指针来访问子类中的方法,这种情况在项目中经常会遇到。如果想通过一个父类的指针访问子类中的方法怎么办呢?只需要在父类的相关方法前增加一个关键字:virtual

如下代码:

 1 #include <iostream>
2
3 class Father
4 {
5 public:
6 virtual void play() //在父类 play() 方法前增加 virtual 关键字
7 {
8 std::cout << "这是个父类的play" << std::endl;
9 }
10 };
11
12 class Son : public Father
13 {
14 public:
15 void play()
16 {
17 std::cout << "这是个子类的Play" << std::endl;
18 }
19 };
20
21
22 void party(Father** men, int num)
23 {
24 for (int i = 0; i < num; i++)
25 {
26 men[i]->play();
27 }
28 }
29
30 int main()
31 {
32 Father father;
33 Son son;
34
35 Father* p; //定义一个父类的指针 P
36 p = &son; //指针引用子类地址
37 p->play(); //访问指针中的 play() 方法,访问的会是子类的 play() 么?
38
39 }

运行结果为:

  这是个子类的Play

总结:

这就是使用多态之后的结果,多态就是通过一个父类的指针,能够调用父类与子类他们各自的方法。如果不使用多态,调用子类的方法时也会执行父类的方法。

==========================================================================================================================

最新文章

  1. 未能添加对***.dll的引用问题
  2. ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
  3. 关于Spark中RDD的设计的一些分析
  4. JavaMail API 1.4.7邮件发送
  5. C#将datatable的某一列转换成json格式的字符串
  6. 【转】css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?
  7. app.get is not a function解决方案
  8. 亚马逊AWS学习——VPC里面几个概念的关系
  9. Linux学习笔记:nginx基础
  10. 吴裕雄 python深度学习与实践(4)
  11. ftp服务部署
  12. 玩转Hook——Android权限管理功能探讨(二)
  13. BootStrapTable 文档
  14. Eclipse的bug,SunTlsRsaPremasterSecret KeyGenerator not available
  15. 多进程+协程 处理IO问题
  16. 连接数据库及出现System.AccessViolationException错误的解决方法
  17. thinkphp 去除空格
  18. OpenCV中图像融合
  19. RxJava 1.x 笔记:变换型操作符
  20. Oracle GoldenGate同步服务归档空间维护

热门文章

  1. 修改centos6启动动画(plymouth方式)
  2. 测试_QTP原理
  3. flink1.10版本StreamGraph生成过程分析
  4. Mac系统使用Parallels Desktop安装Win10
  5. new Date在不同浏览器识别问题
  6. 查看php扩展
  7. 修改pycharm中的flask项目名遇到的坑
  8. leetcode 1046
  9. Java基础教程——注解
  10. Java基础教程——String类