第6章多态性与虚函数 6.1多态性的概念 6.3虚函数 6.2一个典型的例子 6.4纯虚函数与抽象类
1 6.1 多态性的概念 6.3 虚函数 6.2 一个典型的例子 6.4 纯虚函数与抽象类 第6章 多态性与虚函数
6.1多态性的概念 多态性(polymorphism)是面向对象程序设计的 重要特征。利用多态性,可以设计一个易于扩展的系 统。 什么叫多态? 一种事物的多种形态。 >在C++中,是指具有不同功能的函数可以用同一个函 数名。 >面向对象方法中描述多态性:向不同的对象发送同一 个消息,不同的对象在接收时会产生不同的行为(即方 法)
2 6.1 多态性的概念 多态性( polymorphism ) 是面向对象程序设计的 重要特征。利用多态性,可以设计一个易于扩展的系 统。 什么叫多态? 一种事物的多种形态。 ➢在C++中,是指具有不同功能的函数可以用同一个函 数名。 ➢面向对象方法中描述多态性:向不同的对象发送同一 个消息,不同的对象在接收时会产生不同的行为(即方 法)
6.1多态性的概念 多态性分为以下两类: ,静态多态性:编译时。编译器对源程序进行编 译时就可以确定所调用的是哪一个函数。 实现方式:函数重载(普通函数、成员函数、构 造函数)运算符重载 动态多态性:运行时。在程序运行过程中根据 具体情况来确定调用的是哪一个函数。 实现方式:虚函数
3 多态性分为以下两类: ➢ 静态多态性:编译时。编译器对源程序进行编 译时就可以确定所调用的是哪一个函数。 实现方式:函数重载(普通函数、成员函数、构 造函数) 运算符重载 ➢ 动态多态性:运行时。在程序运行过程中根据 具体情况来确定调用的是哪一个函数。 实现方式: 虚函数 6.1 多态性的概念
例6.1:基类指针指向派生类对象 ① #include <iostream> void display()∥与基类同名函数 ② {cout<<"num:"<<num #include <string> ③ <<"name:"<<name using namespace std; ④ class student/定义基类 ④ <<"score:"<<score ⑤ ⑤ public: <<"pay:"<<pay<<endl; ⑥ private:float pay; student(int n,string nam,float s) ⑦ ⑦ ; num=n;name=nam;score=s; ⑧ ⑧ void main() void display() ⑨ {cout<<"num:"<<num ⑨ {student st1(1001,"Li",87.5); 0 ⑩ <<"name:"<<name graduate g1(2001,"wan",98.5,563.5) ① ① student*pt=&st1;∥定义指向基类) <<"score:"<<score<<endl;} 象的指针变量pt protected: pt->display();∥调用基类成员函数 int num;string name;float score; pt=&g1;∥指向派生类对象g1, ④ }; pt->display(); class graduate public student ⑤ (public:graduate (int n,string nam, float s,float p): /仅输出了派生类对像的基类数据成 student (n,nam,s),pay(p){} 员,因为它调用的是基类成员函 数display!
4 例6.1: 基类指针指向派生类对象 ① #include <iostream> ② #include <string> ③ using namespace std; ④ class student //定义基类 ⑤ {public: ⑥ student(int n,string nam, float s) ⑦ { num= n; name= nam; score= s; } ⑧ void display( ) ⑨ {cout<<" num:"<<num ⑩ <<" name:"<<name ⑪ <<" score:"<<score<<endl; } ⑫ protected: ⑬ int num; string name; float score; ⑭ }; ⑮ class graduate : public student ⑯ {public: graduate (int n, string nam, float s, float p): ⑰ student (n,nam,s), pay(p) { } ① void display( ) //与基类同名函数 ② {cout<<"num:"<<num ③ <<" name:"<<name ④ <<" score:"<<score ⑤ <<" pay:"<<pay<<endl; } ⑥ private: float pay; ⑦ }; ⑧ void main( ) ⑨ { student st1(1001,"Li",87.5); ⑩ graduate g1(2001, "wan",98.5,563.5); ⑪ student * pt = &st1;//定义指向基类对 象的指针变量pt ⑫ pt->display( ); // 调用基类成员函数 ⑬ pt = &g1; // 指向派生类对象g1, ⑭ pt->display( ); ⑮ } //仅输出了派生类对象的基类数据成 员,因为它调用的是基类成员函 数display!
一龙生九子,九子各不同。 继承性 多态性 2025/4/6
一龙生九子,九子各不同。 继承性 多态性 2025/4/6 5