关闭

C++的多态

标签: C++ 多态 虚函数
207人阅读 评论(0) 收藏 举报
分类:

     多态是面向对象的一个重要特性,如果一种语言只支持类而不支持多态,只能称为是基于对象的,如VB。C++是面向对象的程序设计语言,利用多态特性可以更加利于扩展。

     在C++程序设计中,多态是指具有不同功能的函数(不同但相似)可以共用同一个函数名,即通过一个相同的函数名可以调用不同功能的函数。多态分为静态多态(编译时确定具体函数功能,通过函数的重载实现)与动态多态(运行时确定具体函数功能,通过虚函数实现)。

    1、虚函数(Vritual Function)

    虚函数允许基类对象调用子类的虚函数(要经过对象转化),即子类中的虚函数可以取代原来的虚函数,因此在使用基类指针指向子类的对象后,调用函数时就调用了子类中的虚函数。

    把基类中某一函数定义为虚函数后,允许但不必须对该函数重新定义(重定义时要保证声明的形式一模一样),赋予它新的功能。

    C++规定,当基类中的函数被声明为虚函数后,其子类中的同名函数被自动声明为虚函数,但最好加上virtual,保持程序更加清晰,如子类中没有重新定义此虚函数,则派生类中简单的继承其基类中的虚函数。

    实现:

    (1)定义一个指向基类对象的指针变量,并使它指向同一类族中的某一对象(指针可以向下指,但不能向上指,即只可以指向子类对象)

    (2)通过指针变量调用此虚函数,此时调用的指针变量是指向子类中的同名函数。

       纯虚函数

 基类中该函数并没有实际作用,但是在派生类中却都发挥了很大的作用,为了有上述虚函数的多态性的有点,我们在基类中将这个函数声明为纯虚函数。为了简化,可以不写出这种无意义的函数题,只给出函数的原型,并在后面加 “= 0”    (pure virtual function)

  virtual 函数类型 函数名 (参数列表)= 0;   //如virtual float area() = 0;

  1. 纯虚函数没有函数体
  2. 最后面的“=0”并不表示函数返回值为0,它只是起形式上的作用,告诉编译系统“这是纯虚函数”,这是一个声明语句,所以后面要有分号。

  纯虚函数只是有函数的名字而不具备函数的功能,不能被调用。它的作用是在基类中为其派生类保留一个函数的名字,一边派生类根据需要对它进行定义。因为如果没有在基类中保留函数名字,则无法实现多态性。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数进行定义,则该虚函数在派生类中仍然为纯虚函数。(即不能被调用)

    抽象类

    含有纯虚函数的类均称为抽象类,该类的目的不是创建对象,而是作为基类实现多态,它是无法创建对象的。

    虚函数与纯虚函数小结:

  1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。
  2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义。
  3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。
  4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。
  5. 虚函数的定义形式:virtual 函数类型 函数名 (参数列表){method body}     纯虚函数的定义形式:virtual 函数类型 函数名 (参数列表) = 0; 
  6. 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。
  7. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。

0
0
查看评论

学习c++多态的几个小例子

//reference: http://blog.csdn.net/hackbuteer1/article/details/7475622 #include #include #include using namespace std; class Time { public: int...
  • Gone_HuiLin
  • Gone_HuiLin
  • 2016-12-02 14:43
  • 871

20170326_请说出C++多态的含义

20170326_请说出C++多态的含义
  • cmm0401
  • cmm0401
  • 2017-03-26 10:18
  • 977

一个很短但能够体现C++的多态的例子

通过用虚函数利用基类指针指向其各个派生类,减少了代码的冗余 #include  using namespace std; class USB { public: virtual void _connect() = 0; virtual void _discon...
  • qq_37018433
  • qq_37018433
  • 2017-01-22 19:10
  • 407

c++多态总结

概述Parent *p = new Child();//父类指针指向子类对象 p->print();//编译器为了安全会调用父类方法 我们希望父类对象调用父类方法,子类对象调用子类方法。因此,引入多态概念,使用虚函数,实现期望。函数重写 在子类中定义与父类中原型相同的函数 函数重写只发...
  • sjtu_chenchen
  • sjtu_chenchen
  • 2015-08-27 23:06
  • 1498

C/C++继承类的多态表现

学过C++和Java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装、继承、多态,所有今天我们就来简单了解一下C++和Java在多态这方面的不同。 首先我们各看一个案例。 C++ //测试继承与多态 class Animal { public: c...
  • dongxianfei
  • dongxianfei
  • 2016-12-29 16:14
  • 815

C++多态深入理解

1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。 4. 多...
  • pzhw520hchy
  • pzhw520hchy
  • 2016-07-07 12:35
  • 1437

C++多态的概念以及用途(通俗易懂)

基类的指针也可以指向派生类对象,请看下面的例子: #include using namespace std;//基类Peopleclass People{public: People(char *name, int age); void display();protected:...
  • zhanghow
  • zhanghow
  • 2016-12-12 21:22
  • 1507

C++中多态性和重载

面向对象的三大特征: 1.封装:保证对象自身数据的完整性、安全性 2.继承:建立类之间的关系,实现代码复用、方便系统的扩展 3.多态:相同的方法调用可实现不同的实现方式。多态是指两个或多个属于不同类的对象,对于同一个消息(方法调用)作出不同响应的方式。 、、、、、、、、、 ...
  • shujun19941226
  • shujun19941226
  • 2016-03-10 19:37
  • 601

C++学习笔记之多态(虚函数)

多态可以分为静态的多态和动态多态,静态多态即所谓的函数重载,在编译阶段即可确定是使用哪个函数。动态多态是通过虚函数来实现的,并基于类的继承来表现。 在使用过程中应注意以下几点: 1、虚函数使用过程中,需要用父类指针指向子类,如下例子中Animal *Ani = new Dog; 2、在子类中的同名虚...
  • ljp1919
  • ljp1919
  • 2015-10-03 15:16
  • 974

C++中引用(&)的用法和应用实例===引用和多态的关系!!!!!!!!!!!!!!!!!

http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html C++中引用(&)的用法和应用实例 对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言...
  • wangyin159
  • wangyin159
  • 2015-08-29 19:34
  • 1866
    个人资料
    • 访问:20513次
    • 积分:992
    • 等级:
    • 排名:千里之外
    • 原创:78篇
    • 转载:6篇
    • 译文:1篇
    • 评论:12条
    文章分类
    最新评论