C++ 虚函数表与多态 —— 多态的简单用法
2024-10-21 04:02:58
首先看下边的代码,先创建一个父类,然后在来一个继承父类的子类,两个类中都有自己的 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
总结:
这就是使用多态之后的结果,多态就是通过一个父类的指针,能够调用父类与子类他们各自的方法。如果不使用多态,调用子类的方法时也会执行父类的方法。
==========================================================================================================================
最新文章
- 未能添加对***.dll的引用问题
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
- 关于Spark中RDD的设计的一些分析
- JavaMail API 1.4.7邮件发送
- C#将datatable的某一列转换成json格式的字符串
- 【转】css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?
- app.get is not a function解决方案
- 亚马逊AWS学习——VPC里面几个概念的关系
- Linux学习笔记:nginx基础
- 吴裕雄 python深度学习与实践(4)
- ftp服务部署
- 玩转Hook——Android权限管理功能探讨(二)
- BootStrapTable 文档
- Eclipse的bug,SunTlsRsaPremasterSecret KeyGenerator not available
- 多进程+协程 处理IO问题
- 连接数据库及出现System.AccessViolationException错误的解决方法
- thinkphp 去除空格
- OpenCV中图像融合
- RxJava 1.x 笔记:变换型操作符
- Oracle GoldenGate同步服务归档空间维护