关闭

多态性

156人阅读 评论(0) 收藏 举报
分类:
多态性(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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7852次
    • 积分:308
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:5篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论