文档章节

C++多态之虚函数

o
 osc_w9s1w4o0
发布于 2019/04/11 19:24
字数 517
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。

 

在c++中实现多态,我需要利用基类指针可以在隐式转换下指向派生类这一特性。当我们传入不同的对象(基类或派生类)就可以发生多态

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Parent{
 6 public:
 7      void fun()
 8     {
 9         cout << "我是爸爸" << endl;
10     }
11     void test()
12     {
13         cout << "parent~~~~我是用来测试的" << endl; 
14     }
15 };
16 
17 class Son:public Parent
18 {
19 public:
20     void fun()
21     {
22         cout << "我是儿子" << endl;
23     }
24     void measurement()
25     {
26         cout << "son~~~~我是用来测试的" << endl;
27     }
28 };
29 
30 
31 void Go(Parent *p)
32 {
33     p->fun();
34 }
35 int main()
36 {
37     Parent p;
38     Son S;
39     Go(&p);
40     Go(&S);
41     system("pause");
42     return 0;
43 }

 上述代码中,void Go(Parent *p)函数就相当于领班发出的命令,Parent,Son就相当于不同的两个工人,而void fun()函数就相当于他们各自负责的工作。

运行结果:

 

而此时结果并不是我们所想的那样。让我们来分析一下:

p指针是指向基类的指针,所以他只能访问Parent::fun()和Parent::test()。并不能访问Son::fun()。为了解决这个问题我们必须要使用virtual关键字,在基类的将基类的void fun()函数写成虚函数,在派生类中在进行从写。这样我门就能很好的达到多态的目的。

运行结果:

在此我们已经成功的使用了多态,p指针是如何来选择到底是选择那个void fun()函数的呢?

其实在存在虚函数的类中都存在一个指向虚函数表的指针(VPTR)。在发生多态时都是根据VPTR指针的索引来调用不同的函数。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
C++深度解析 C++对象模型分析(下) --- 继承对象模型,多态对象模型,虚函数表,用C语言实现多态(50)

C++深度解析 C++对象模型分析(下) --- 继承对象模型,多态对象模型,虚函数表,用C语言实现多态(50) 继承对象模型 在C++编译器的内部类可以理解为结构体。 子类是由 父类成员 叠加 子类新...

mainn
03/31
0
0
C++继承-重载-多态-虚函数

C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如...

osc_80l29rkk
2019/05/20
6
0
C++语言细节

猜一猜上面输出结果是什么呢?是的,你猜对了! C++多态实现及原理 C++ 多态的实现原理与内存模型 多态在C++中是一个重要的概念,通过虚函数机制实现了在程序运行时根据调用对象来判断具体调...

wqli
2019/10/23
0
0
C++ 多态的实现及原理

C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对...

osc_sdo8al3q
2018/09/12
0
0
C++ 类(多态(1))

文章概述 1.多态出现的背景(赋值兼容性原则遇上函数重写); 2.多态理论联系实际; 3.多态成立的3个条件; 4.多态的理论基础; 5.多态的C++实现以及多态的实现效果; 6.虚析构函数; 多态出现的背景...

下忍
06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hacker News 简讯 2020-07-10

更新时间: 2020-07-10 01:15 US Supreme Court deems half of Oklahoma a Native American Reservation - (reuters.com) 美国最高法院认为俄克拉荷马州的一半是印第安人保留地 得分:131 | 评...

FalconChen
29分钟前
16
0
OSChina 周五乱弹 —— 求求你吃了我吧,不要再玩弄食物的感情了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :张喆的单曲《陷阱 》 这首歌已经在网易找不到原唱了,不知道被哪家买了版权。#今日歌曲推荐# 《陷阱 》- 张喆 手机党少年们想听歌...

小小编辑
40分钟前
24
1
清华陈文光教授:AI 超算基准测试的最新探索和实践。

道翰天琼认知智能平台为您揭秘新一代人工智能。 无规矩不成方圆。放在超级计算机的研发领域,没有一个大家普遍接受的算力评测指标,便难以推动超算迅猛发展。 而现在伴随着人工智能的发展,大...

jackli2020
54分钟前
7
0
@RequestMapping, consumes 提交简单有意思的测试

getParm @GetMapping("getParm")public Result getParm(String id){ System.out.println(); return ResultFactory.success(id);} 等同于 == bodyParm @PostMapping("bodyParm......

莫库什勒
今天
25
0
63. Unique Paths II

题目: 63. Unique Paths II A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any p......

JiaMing
今天
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部