北大青鸟 c 第九章 多态 Ⅴ ersion3.0 CHA
Version 3.0 多态 第九章
回顾 继承 访问控制 继承中的构造函数和析构函数 函数覆盖 北大青鸟
2 回顾 • 继承 • 访问控制 • 继承中的构造函数和析构函数 • 函数覆盖
目标 虚函数 纯虚函数 抽象类 动态绑定 虚析构函数 北大青鸟
3 目标 • 虚函数 • 纯虚函数 • 抽象类 • 动态绑定 • 虚析构函数
虚函数 基类的指针可以指向派生类的对象 但调用的函数却是基类的函数 虚函数可以解决这个问题 北大青鸟
4 虚函数 • 基类的指针可以指向派生类的对象 • 但调用的函数却是基类的函数 • 虚函数可以解决这个问题
示例21 sinclude class shapes public: void draw o //基类中的函数 cout<"绘制基本形状\n"; class Circle public Shap private: int radius; public: void draw o //在派生类中重新定义 cout<<"绘制圆形\n"; 北大青鸟
5 示例 2-1 #include class Shapes { public: void draw() //基类中的函数 { cout << "绘制基本形状\n"; } }; class Circle : public Shapes { private: int radius; public: void draw() //在派生类中重新定义 { cout << "绘制圆形\n"; } };
示例22 class Square public Shapes private int length public: void draw o //在派生类中重新定义 coutdraw)i ptr &s ptr->drawoi 6 北大青鸟
6 示例 2-2 class Square : public Shapes { private: int length; public: void draw() //在派生类中重新定义 { cout draw(); ptr = &s; ptr->draw(); } 调用Shapes 的draw()方 法
虚函数的定义 希望使用raw)函数绘制不同对象 draw()函数必须在基类中被声明为虚函数 virtual void draw o //基类中的虚函数 cout<<"绘制基本形状\n 北大青鸟
7 虚函数的定义 • 希望使用draw( )函数绘制不同对象 • draw( )函数必须在基类中被声明为虚函数 virtual void draw() //基类中的虚函数 { cout << "绘制基本形状\n"; }
虚函数的覆盖 派生类替换基类提供的虚函数实现 编译器确保调用函数的正确版本 北大青鸟
8 虚函数的覆盖 • 派生类替换基类提供的虚函数实现 • 编译器确保调用函数的正确版本
演示 使用虚函数演示 前面的例子 轴2 北大青鸟
9 演示 使用虚函数演示 前面的例子
注意要点 virtua关键字 虚函数必须在声明它的类中有定义 在派生类中重新定义的虚函数必须具有相同 的参数 北大青鸟
10 注意要点 • virtual关键字 • 虚函数必须在声明它的类中有定义 • 在派生类中重新定义的虚函数必须具有相同 的参数