多态性

多态性(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值