多态性

原创 2016年06月01日 11:34:20
多态性(polymorphism)是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。 

在C++程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。
在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。
在C++程序设计中,在不同的类中定义了其响应消息的方法,那么使用这些类时,不必考虑它们是什么类型,只要发布消息即可。
从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。
以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。

静态多态性是通过函数的重载实现的,运算符重载实质上也是函数重载。
动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。 
动态多态性是通过虚函数(virtual function)实现的。

 实现过程:
  声明一个基类指针,先使这个指针指向一个基类,通过指针调用函数虚函数func();
  然后使此指针指向一个派生类,通过指针可以调用与基类函数func同名的函数func();

 总结:
  基类指针可以根据指向的类到底是基类还是派生类,来调用不同类的同名函数。
  函数重载处理的是同一层次的函数同名的问题,虚函数处理的是不同派生层次上的函数重名问题。
  前者可以被称为横向重载,后者可以被称为纵向重载
  前者在编译期间确定调用的是哪一个函数,被称为静态关联;后者在运行期间确定,被称为动态关联

多态性类型
静态
动态
实现
函数重载
虚函数
类族的派生层次 同一层次
不同层次
重载方向
横向重载
纵向重载
函数的确定时期
编译时期
运行期间


代码清单:
#include <iostream>
#include <stdlib.h>
using namespace std;

//基类
class Student
{
public :
 Student(int s_num, int s_score)
 {
  this->num = s_num;
  this->score = s_score;
 }
 //~Student{ }

 virtual void Show()
 {
  cout<<"student's num is "<<this->num<<endl;
  cout<<"student's score is "<<this->score<<endl;
  cout<<"\n";
 }

 int num;
 int score;
};

//派生类
class Graduate : public Student
{
public:
 Graduate(int s_num, int s_score, int s_pay) : Student(s_num, s_score)
 {
  this->pay = s_pay;
 }
 //~Graduate(){ }

 void Show()
 {
  cout<<"graduate's num is "<<this->num<<endl;
  cout<<"graduate's score is "<<this->score<<endl;
  cout<<"graduate's pay is "<<this->pay<<endl;
  cout<<"\n";
 }

 int pay;
};

int main(void)
{
 Student *sPtr = NULL;
 Student stu(100, 589);
 Graduate gra(101, 600, 8000);

 sPtr = &stu;
 sPtr->Show();

 sPtr = &gra;
 sPtr->Show();

 system("pause");
 return 0;
}

输出结果:
student's num is 100
student's score is 589

graduate's num is 101
graduate's score is 600
graduate's pay is 8000

相关文章推荐

java多态性讲解

  • 2015年12月16日 15:43
  • 20KB
  • 下载

类的多态性和虚拟函数的使用

  • 2017年08月14日 14:30
  • 2.04MB
  • 下载

Java多态性理解,好处及精典实例

核心: 1、多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到...

C++继承与多态性

  • 2017年04月25日 15:51
  • 2.3MB
  • 下载

实验7 多态性

  • 2011年12月25日 15:49
  • 29KB
  • 下载

第13周-多态性-项目3-立体类族共有的抽象类

/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:201...

c++课件 多态性与虚函数

  • 2012年05月08日 15:52
  • 391KB
  • 下载

试谈C_的多态性和虚函数

  • 2012年07月04日 17:00
  • 20KB
  • 下载

程序设计基石与实践之应用多态性的工资发放系统

本博文通过包含了一个公司支付系统中各种雇员情况的一个继承层次来讨论基类和派生类之间的关系.佣金雇员(表示为一个基类对象)的薪水完全是销售提成,带底薪佣雇员(表示为一个派生类的对象)的薪水由底薪和销售提...
  • utimes
  • utimes
  • 2014年12月31日 23:11
  • 1544

多态性的设计与实现

  • 2012年11月19日 11:24
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态性
举报原因:
原因补充:

(最多只允许输入30个字)