C++ 多态性和虚函数
2017-06-27 19:17:52
C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助。
一、多态的作用:
- 隐藏实现细节,使得代码能够模块化;
- 接口重用,实现“一个接口,多种方法”;
二、虚函数的声明:
class Base
{
virtual 返回值类型 函数名(形参表){}
}
- 当基类的某个成员函数被声明为虚函数后,其子类中的函数如果返回值类型,函数名,形参表一致的话,不论是否加了virtual关键字,都会被认为是虚函数。反之,则是同名隐藏。
- virtual关键字只是在类中声明的时候必须加上,在类外定义的时候不需要加virtual关键字
- 构造函数,静态成员函数不能是虚函数,析构函数可以是虚函数,甚至鼓励将析构函数写成虚函数
- 只有通过基类的对象指针,基类的对象引用来调用派生类的虚函数,才能体现虚函数的特性。单纯通过子类来调用虚函数是无法体现这种动态联编的特性的。
A* p=&b
A& p=b
三、多态性的实现
可以使用基类的对象指针来先后指向同一类族中的不同类对象,以便使用相同的调用方法去调用不同派生类的同名虚函数。
class A
{
int a;
public:
A(int x)
{
a=x;
} virtual void get(){cout<<"A::"<<a<<endl;}
}; class B:public A
{
int b;
public:
B(int x,int y):A(x)
{
b=y;
} void get(){cout<<"B::"<<b<<endl;}
}; class C:public B
{
int c;
public:
C(int x,int y,int z):B(x,y)
{
c=z;
} void get(){cout<<"C::"<<c<<endl;}
}; int main()
{
C c1(,,);
A* p1=&c1;
B* p2=&c1;
p1->get();
p2->get();
return ;
}

四、纯虚函数
定义一个基类的时候如果还无法给出虚函数的具体实现方式,可以将之声明为纯虚函数,纯虚函数的实现完全依赖于各个派生类。
纯虚函数的声明:
virtual 返回值类型 函数名(形参表)=0;
- 因为无法给出纯虚函数的定义所以没有函数体,没有函数体和函数体为空是两个概念,要加以区分;
- 函数名赋值为0,本质上是将指向该函数的指针的地址赋值为0。在派生类没有重定义之前是无法加以使用的。
五、抽象类
抽象类是指无法定义对象只能作为基类的一种特殊的类,但是可以定义对象指针,目的是为了实现多态性。
抽象类有两种:
- 有纯虚函数的基类
- 构造函数或者析构函数被定义为protected访问
C++ 多态性和虚函数的更多相关文章
- sdut 6-2 多态性与虚函数
6-2 多态性与虚函数 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limit ...
- C++学习之路—多态性与虚函数(二)纯虚函数与抽象类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1 纯虚函数 在前面的博客中已经提到:有时 ...
- C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...
- C++之多态性与虚函数
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...
- [转]C++之多态性与虚函数
面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接 ...
- 2013级C++第14周(春)项目——多态性、虚函数和抽象类
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 阅读程序1.阅读.改动和执行关于交通 ...
- c++特别要点:多态性与虚函数
本来是准备在工厂模式中顺便整理.但粗略浏览了,内容还是很多,需要单独开一篇. 一.什么是多态性? 多态性可以概括为“一个接口,多种方法”. 多态与非多态的区别在于“成员函数调用地址的早绑定和晚绑定”. ...
- C++多态性:虚函数的调用原理
多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数. 一个函数说明为虚函数,表明在继承的类中重载这个函数时 ...
随机推荐
- svn回滚到某一版本
svn回滚到某一版本 (1)在代码文件夹或vs中show log,查看历史,记住想要回滚到的版本号如1000 (2)新建文件夹,右击svn checkout,在revision中输入版本号1000
- BabelMap 12.0.0.1 汉化版(2019年3月11日更新)
软件简介 BabelMap 是一个免费的字体映射表工具,可辅助使用<汉字速查>程序. 该软件可使用系统上安装的所有字体浏览 Unicode 中的十万个字符,还带有拼音及部首检字法,适合文献 ...
- Hive 常用语句(持续更新中)
1)按包含关键字在指定库中查找表名:show tables in dw '*_fab_*'; 2)查看和删除自己hdfs系统所用的空间和文件(与shell命令合用):hive命令行下: --查看仓 ...
- 每天一个Linux命令(1)ls命令
ls是list的缩写,ls命令是Linux系统下最常用的命令之一. ls命令用于打印当前目录的清单,如果指定其它目录,那么就会显示其他目录的文件及文件夹的清单. 通过ls 命令还可以查看文件其它的详细 ...
- Filter过滤器与Session会话跟踪技术
Filter过滤器 适用场景 1.为web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码)2.用户授权Filter:负责检查用户请求,根据请 ...
- 音响理论基础入门:Gain(增益)
谈到放大器就必须先了解增益:一个小的信号Level(电平)经过放大电路成为大的信号Level ,也就是说由小变大之间的差异就叫增益,也叫放大率,反过来的叫衰减率.在音响系统内,一般以信号源的输入电平决 ...
- Linux中Postfix邮件WebMail配置(七)
Extmail Extmail 是一个以perl语言编写,面向大容量/ISP级应用,免费的高性能Webmail软件,主要包括ExtMail.Extman两个部分的程序套件.ExtMail套件用于提供从 ...
- PHP微信公众号后台开发(Yii2实现)
本文内容较多,包括微信接入.获取微信用户信息.微信支付.JSSDK配置参数获取等部分.如果读者对微信开发没有一个主观上的认识,那么建议读者先研读微信公众平台开发者文档,然后再阅读本文,效果更佳!另外本 ...
- java读书笔记二
这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向 ...
- 关键字union
union有一个作用就是判断,pc是大端存储还是小端存储的,x86是小端存储的,这个东西是有cpu决定的.arm(由存储器控制器决定)和x86一样都是小端的. 下面的是一个大端小端的一个例子,代码如下 ...