多态性

原创 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

SDUT2679 6-1 多态性与虚函数

6-1 多态性与虚函数#include using namespace std;class Pet { public: virtual void speak()//定义基类函数为虚函数 ...
  • yue_luo_
  • yue_luo_
  • 2016年10月28日 15:40
  • 499

面向对象-多态性

 面向对象的软件开发语言具有三个重要的特点分别为封装性、继承性、多态性。封装性即意味着对象封装其内部的数据,使其对外不可见,以保证数据的安全性。继承性是代码复用的一个很好的解决方案,但是继承关系是编译...
  • slg_sparkler
  • slg_sparkler
  • 2007年03月21日 22:28
  • 2201

C++ 多态性有哪些

C++多态性有哪些?       概念:指相同的对象收到不同的消息或者不同的对象收到相同的消息时产生的不同的实现动作。 C++支持两种多态:编译时多态(静态)、运行时多态(动态) (1)编译时多态...
  • YF_Li123
  • YF_Li123
  • 2017年07月03日 21:50
  • 1441

面向对象的特点,封装性,继承性,多态性!

1.面向对象程序设计有三大特点,分别是封装,继承,多态,接下来就介绍一下这三个特点,积累一下。 2.封装,封装是面向对象编程的核心思想,将对象的属性和行为封装起来,而将对象的属性和行为封装起来的载体是...
  • u012561176
  • u012561176
  • 2015年01月29日 19:37
  • 1644

关于C++多态性的一些总结

在学习过程中对多态特性的实现方式及其实现原理的一些总结
  • Phoenix500526
  • Phoenix500526
  • 2015年03月31日 07:59
  • 839

Java-6.22-接口多态性

要点: 接口产生的多态是指不同类在实现同一个接口的时候有不同的实现方式,那么接口变量在回调接口方法时就可以产生多种形态。 代码: ComputerAverage.java public int...
  • qq_34216631
  • qq_34216631
  • 2016年10月16日 13:29
  • 455

多态性和动态联编的分析

参考:http://www.yesky.com/385/1785885.shtml     http://www.bbsshow.net/dispbbs.asp?    boardid=79&id=4...
  • BEN1978
  • BEN1978
  • 2006年05月15日 16:17
  • 2442

对象多态性的理解

面向对象的三大特性:封装—保护类中的属性不被外部直接访问到;继承—扩展类的属性和功能;那么多态性呢?多态性是Java中最强悍的地方,那么有一个简单但是又需要好好推敲的疑问:什么是多态?什么是对象的多态...
  • jakezhang1990
  • jakezhang1990
  • 2017年03月30日 22:24
  • 836

类的多态性体现

引用多态: 父类的引用可以指向本类的对象 父类的引用指向了自己的子类对象. 方法多态: 创建本类对象时,调用的方法为本类方法. 创建子类对象时,调用的方法为子类重写方法或继承方法.(注:...
  • u011296485
  • u011296485
  • 2017年09月15日 15:53
  • 109

C++多态性的理解和举例

多态性是面向对象c'x'de
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年08月05日 20:43
  • 809
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多态性
举报原因:
原因补充:

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