2017-06-27 19:17:52

C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助。

一、多态的作用:

  1. 隐藏实现细节,使得代码能够模块化;
  2. 接口重用,实现“一个接口,多种方法”;

二、虚函数的声明:

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。在派生类没有重定义之前是无法加以使用的。

五、抽象类

抽象类是指无法定义对象只能作为基类的一种特殊的类,但是可以定义对象指针,目的是为了实现多态性。

抽象类有两种:

  1. 有纯虚函数的基类
  2. 构造函数或者析构函数被定义为protected访问

C++ 多态性和虚函数的更多相关文章

  1. sdut 6-2 多态性与虚函数

    6-2 多态性与虚函数 nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit1000ms Memory Limit ...

  2. C++学习之路—多态性与虚函数(二)纯虚函数与抽象类

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 1    纯虚函数 在前面的博客中已经提到:有时 ...

  3. C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...

  4. C++之多态性与虚函数

    面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了&quo ...

  5. C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)

    多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...

  6. [转]C++之多态性与虚函数

    面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为.在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体.也可以这样说就是实现了“一个接 ...

  7. 2013级C++第14周(春)项目——多态性、虚函数和抽象类

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 阅读程序1.阅读.改动和执行关于交通 ...

  8. c++特别要点:多态性与虚函数

    本来是准备在工厂模式中顺便整理.但粗略浏览了,内容还是很多,需要单独开一篇. 一.什么是多态性? 多态性可以概括为“一个接口,多种方法”. 多态与非多态的区别在于“成员函数调用地址的早绑定和晚绑定”. ...

  9. C++多态性:虚函数的调用原理

    多态性给我们带来了好处:多态使得我们可以通过基类的引用或指针来指明一个对象(包含其派生类的对象),当调用函数时可以自动判断调用的是哪个对象的函数. 一个函数说明为虚函数,表明在继承的类中重载这个函数时 ...

随机推荐

  1. mysql数据安装问题汇总

    1.mysql安装冲突:conflicts with file from package 看到“conflicts”,是产生冲突了,文件“/usr/share/mysql/charsets/*”需要M ...

  2. linux 图形界面的安装

    本文内容主要摘自:http://blog.csdn.net/hotday_kevin/article/details/8310054 文中图形的安装和卸载都给了两种方式,貌似是因为都是版本的问题而不同 ...

  3. Mocha describe 生命周期

    1 describe('test', function() { 2 // 在本测试块的所有测试用例之前执行且仅执行一次 3 before(function() { 4 5 }); 6 // 在本测试块 ...

  4. 50道JavaScript基础面试题(附答案)

    https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...

  5. linux 挂载硬盘 + 对硬盘 分区

    parted命令可以划分单个分区大于2T的GPT格式的分区,也可以划分普通的MBR分区 fdisk命令对于大于2T的分区无法划分,所以用fdisk无法看到parted划分的GPT格式的分区 1. 用 ...

  6. ThinkPHP5跨控制器调用

    1.在application\index\controller\文件夹里新建User.php <?php namespace app\index\controller; class User{ ...

  7. Python3基础 bool类型变量赋值

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. strerror函数的总结

    定义函数:char * strerror(int errnum); 函数说明:strerror()用来依参数errnum 的错误代码来查询其错误原因的描述字符串, 然后将该字符串指针返回. 返回值:返 ...

  9. P4113 [HEOI2012]采花 (莫队TLE)

    思路 update 11.2 树状数组AC 本题莫队过不去,会TLE ----------------------- 但也是个不错的莫队练手题 ------------------------ 毕竟C ...

  10. AtCoder 杂题训练

    前言: 因为要普及了,今年没一等就可以退役去学文化课了,所以暑假把历年noip普及组都刷了一遍,离noip还有50+天,想弄点强化训练什么的. 想了想,就这些天学文化课之余有空就把AtCoder之前那 ...