113虚函数和运行时的多态 ◆通过指向基类的指针访问基类和派生类 的同名函数,是实现运行时的多态的必 要条件,但不是全部条件 ◆除此以外,还必须将基类中的同名函数 定义为虚函数。 2005-4-28 北京邮电大学电信工程学院计算机技术中心
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -26- 11.3 虚函数和运行时的多态 通过指向基类的指针访问基类和派生类 的同名函数,是实现运行时的多态的必 要条件,但不是全部条件。 除此以外,还必须将基类中的同名函数 定义为虚函数
1131虚函数 ◆虚函数可以在类的定义中声明函数原型的时候 来说明,格式如下 virtua1<返回值类型〉函数名(参数表); 在函数原型中声明函数是虚函数后,具体定义这个 函数时就不需要再说明它是虚函数了。 ◆如果在基类中直接定义同名函数,定义虚函数 的格式是: virtua1<返回值类型〉函数名(参数表) 区函数体 2005-4-28 北京邮电大学电信工程学院计算机技术中心 27
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -27- 11.3.1 虚函数 虚函数可以在类的定义中声明函数原型的时候 来说明,格式如下: virtual <返回值类型> 函数名(参数表); 在函数原型中声明函数是虚函数后,具体定义这个 函数时就不需要再说明它是虚函数了。 如果在基类中直接定义同名函数,定义虚函数 的格式是: virtual <返回值类型> 函数名(参数表) {<函数体>}
1131虚函数 ◆基类中的同名函数声明或定义为虚函数后,派 生类的同名函数无论是不是用 virtual来说 明,都将自动地成为虚函数。从程序可读性考 虑,一般都会在这些函数的声明或定义时,用 virtua1来加以说明。 ◆只要对例11.2中的头文件稍加修改,也就是将 基类和派生类中的 getArea函数都声明为虚函 数,在重新编译和运行程序,就可以得到运行 时的多态的效果 2005-4-28 北京邮电大学电信工程学院计算机技术中心
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -28- 11.3.1 虚函数 基类中的同名函数声明或定义为虚函数后,派 生类的同名函数无论是不是用virtual来说 明,都将自动地成为虚函数。从程序可读性考 虑,一般都会在这些函数的声明或定义时,用 virtual来加以说明。 只要对例11.2中的头文件稍加修改,也就是将 基类和派生类中的getArea函数都声明为虚函 数,在重新编译和运行程序,就可以得到运行 时的多态的效果
◆例11.3将例1.2进行修改,使得程序具有运行时的多态的效 果 基类 Shape的定义 //例1.3: shape.h #ifndef SHAPE H #define shape class Shape I public: virtual double getAreao const void print const // Shape类定义结束 2005-4-28 北京邮电大学电信工程学院计算机技术中心
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -29- 例11.3 将例11.2进行修改,使得程序具有运行时的多态的效 果。 // 例11.3: shape1.h #ifndef SHAPE_H #define SHAPE_H class Shape { public: virtual double getArea() const; void print() const; }; // Shape类定义结束 基类Shape的定义
class Circle: public Sh public 派生类 Circle的定义 Circle( int =0, int =0, double=0.0) virtual double getAreao const /返回面积 void print const /输出 Circle类对象t private int x, y; 派生类 Rectangle的定义 double radius //派生类 Circle定义 结束 class Rectangle public Shape publIC: Rectangle( int=0, int =0) /构造函数 virtual double getAreaoconst /返回面积 void printo const /输出 Rectangle 类对象 private 2车,b; 北京邮电大学电信工程学院计算机技术矩形的长和宽30 /派生类 Rectangle定义结束
2005-4-28 北京邮电大学电信工程学院计算机技术中心 -30- class Circle : public Shape { public: Circle( int = 0, int = 0, double = 0.0 ); virtual double getArea() const; // 返回面积 void print() const; // 输出Circle 类对象t private: int x,y; // 圆心座标 double radius; // 圆半径 }; // 派生类Circle定义 结束 class Rectangle : public Shape { public: Rectangle( int = 0, int = 0); // 构造函数 virtual double getArea() const; // 返回面积 void print() const; // 输 出 Rectangle 类对象 private: int a,b; // 矩形的长和宽 }; // 派生类Rectangle定义结束 派生类Circle的定义 派生类Rectangle的定义