C++多态之虚函数
多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。
在c++中实现多态,我需要利用基类指针可以在隐式转换下指向派生类这一特性。当我们传入不同的对象(基类或派生类)就可以发生多态
#include <iostream>
using namespace std;
class Parent{
public:
void fun()
{
cout << "我是爸爸" << endl;
}
void test()
{
cout << "parent~~~~我是用来测试的" << endl;
}
};
class Son:public Parent
{
public:
void fun()
{
cout << "我是儿子" << endl;
}
void measurement()
{
cout << "son~~~~我是用来测试的" << endl;
}
};
void Go(Parent *p)
{
p->fun();
}
int main()
{
Parent p;
Son S;
Go(&p);
Go(&S);
system("pause");
return ;
}
上述代码中,void Go(Parent *p)函数就相当于领班发出的命令,Parent,Son就相当于不同的两个工人,而void fun()函数就相当于他们各自负责的工作。
运行结果:

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

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



运行结果:

在此我们已经成功的使用了多态,p指针是如何来选择到底是选择那个void fun()函数的呢?
其实在存在虚函数的类中都存在一个指向虚函数表的指针(VPTR)。在发生多态时都是根据VPTR指针的索引来调用不同的函数。

C++多态之虚函数的更多相关文章
- C++中的多态与虚函数的内部实现
1.什么是多态 多态性可以简单概括为“一个接口,多种行为”. 也就是说,向不同的对象发送同一个消息, 不同的对象在接收时会产生不同的行为(即方法).也就是说,每个对象可 ...
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- C++多态、虚函数、纯虚函数、抽象类
多态 同一函数调用形式(调用形式形同)可以实现不同的操作(执行路径不同),就叫多态. 两种多态: (1)静态多态:分为函数重载和运算符重载,编译时系统就能决定调用哪个函数. (2)动态多态(简称多态) ...
- 《挑战30天C++入门极限》C++中类的多态与虚函数的使用
C++中类的多态与虚函数的使用 类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持 ...
- [c++] C++多态(虚函数和虚继承)
转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C+ ...
- C++ 多态与虚函数
1.多态的概念 由虚函数实现的动态多态性就是:同一类族中不同类的对象,对同一函数调用作出不同的响应. 先看下面这个简单的例子: #include<iostream> using std:: ...
- C++中类的多态与虚函数的使用
C++的三大特性:封装.继承.多态.以前学的时候自己没去总结,记得在一本c++入门的书讲得还是比较清楚.今天上网找了一下多态,找到下面这篇文章写得比较清晰. http://pcedu.pconline ...
- C++入门之初话多态与虚函数
多态性是面向对象程序设计的又一个重要思想,关于多态的详尽描述,请看本人的收藏https://www.cnblogs.com/hust-ghtao/p/3512461.html.这篇博文中,详尽的探讨了 ...
- C++多态,虚函数,虚函数表,纯虚函数
1.多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作. C++支持两种多态性:编译时多态性,运行时多态性. a.编译时多态性:通过重载函数实现 ,模板(2次编译) ...
- C++类、继承、多态、虚函数
一个比较好的虚函数例子 /****************************/ /* 作者:骆天 */ /* 时间:2018/1/26 */ /* 代码:多态的理解 */ /********** ...
随机推荐
- Java 开源博客 Solo 1.5.0 发布 - 新皮肤
Solo 1.5.0 正式发布了!这个版本主要是加入了 一款新皮肤 next,感谢一直以来关注和支持我们的朋友! 只需一个命令即可启动(不需要安装数据库.部署容器):也可以通过 war 方式部署容器, ...
- Gulp前端服务器本地搭建
前端服务器本地搭建分三阶段: 1.Node.js的安装 2.Npm环境配置 3.编写JS文件 1.Node.js安装: 如图所示: Next: 选择I accept 然后Next: 选择安装文件的位置 ...
- moveTaskToback退后台的用法及作用
1 方法:public boolean moveTaskToBack(boolean nonRoot) activity里有这个方法,参数说明如下: nonRoot=false→ 仅当activity ...
- Aspose.Pdf v8.4.1 发布
.NET v8.4.1: 修复的错误及漏洞: PDF到JPEG时,内容从最终JPEG文件中丢失. 书签缩放识别错误. Java v4.2: 新特性: 搜索分离超过两行的文本. 修复的异常: PDF到 ...
- windows&cmd常用命令&快捷键
1: cls即CLear Screen 功能:清除屏幕上的所有显示 2:Win+Tab快捷键进行3D窗口切换还有比较快速切换窗口的新方法. 3:利用Alt+Tab快捷键进行切换窗口时,在桌面中间会显示 ...
- java将int类型的变量转化成String类型的
第一种方法:String的valueOf方法,int i=5;String s=String.valueOf(i);第二种方法,直接在int后面加一个空的字符串,因为在java里面,默认任务int类型 ...
- 关于hashcode 里面 使用31 系数的问题
首先我们来了解一下hashcode,什么是hashcode?有什么作用? hashcode其实就是散列码,使用hashcode使用高效率的哈希算法来定位查找对象! 我们在使用容器来存储数据的时候会计算 ...
- 企业级Nginx增加日志选项
日志介绍 目的:将用户的访问信息记录到指定的文件中由ngx_http_log_module模块负责 访问日志参数: access_log:指定日志文件的路径和使用何种日志格式记录日志 log_form ...
- codeforces 12D Ball
codeforces 12D Ball 这道题有两种做法 一种用树状数组/线段树维护区间最值,一种用map维护折线,昨天我刚遇见了一道类似的用STL维护折线的题目: 392D Three Arrays ...
- Debian 静态网络配置
allow-hotplug enp6s0 iface enp6s0 inet static address gateway 192.168.2.1 # dns-* options are implem ...