113虚函数和运行时的多态 ◆通过指向基类的指针访问基类和派生类 的同名函数,是实现运行时的多态的必 要条件,但不是全部条件。 ◆除此以外,还必须将基类中的同名函数 定义为虚函数。 2021/2/24
2021/2/24 -26- 11.3 虚函数和运行时的多态 通过指向基类的指针访问基类和派生类 的同名函数,是实现运行时的多态的必 要条件,但不是全部条件。 除此以外,还必须将基类中的同名函数 定义为虚函数
1131虚函数 ◆虚函数可以在类的定义中声明函数原型的时候 来说明,格式如下 virtua<返回值类型>函数名(参数表) 在函数原型中声明函数是虚函数后,具体定义这个 函数时就不需要再说明它是虚函数了。 如果在基类中直接定义同名函数,定义虚函数 的格式是: virtual<返回值类型>函数名(参数表){<函数 体>} 2021/2/24
2021/2/24 -27- 11.3.1 虚函数 虚函数可以在类的定义中声明函数原型的时候 来说明,格式如下: virtual <返回值类型> 函数名(参数表); ◼ 在函数原型中声明函数是虚函数后,具体定义这个 函数时就不需要再说明它是虚函数了。 如果在基类中直接定义同名函数,定义虚函数 的格式是: virtual <返回值类型> 函数名(参数表) {<函数 体>}
1131虚函数 ◆基类中的同名函数声明或定义为虚函数后,派 生类的同名函数无论是不是用 virtua来说明, 都将自动地成为虚函数。从程序可读性考虑, 一般都会在这些函数的声明或定义时,用 virtua来加以说明 ◆只要对例11.2中的头文件稍加修改,也就是将 基类和派生类中的 getAreal函数都声明为虚函 数,在重新编译和运行程序,就可以得到运行 时的多态的效果。 2021/2/24
2021/2/24 -28- 11.3.1 虚函数 基类中的同名函数声明或定义为虚函数后,派 生类的同名函数无论是不是用virtual来说明, 都将自动地成为虚函数。从程序可读性考虑, 一般都会在这些函数的声明或定义时,用 virtual来加以说明。 只要对例11.2中的头文件稍加修改,也就是将 基类和派生类中的getArea函数都声明为虚函 数,在重新编译和运行程序,就可以得到运行 时的多态的效果
◆例1.3将例11.2进行修改,使得程序具有运行时的多态的效果。 ∥例11.3: shape1h 基类 Shape的定义 ifndef shaPe h define shaPe h class shape t public virtual double getArea( const; void printo const; ∥ Shape类定义结束 2021/2/24
2021/2/24 -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 Shaper public 派生类 Circle的定义 Circle(int=0, int=0, double=0.0; virtual double getArea( const; ∥返回面积 void printo const; ∥输出 Circle类对象t private: int x, y 派生类 Rectangle的定义 double radius. ∥派生类 Circle定义结束 class Rectangle: public Shape I public Rectangle( int =0, int=0); ∥构造函数 virtual double getArea( const; ∥返回面积 void print( const; 输出 Rectang类 对象 private int a b ∥矩形的长和宽 };2021/2/24 ∥派生类 Rectangle定义结束 iendif
2021/2/24 -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定义结束 #endif 派生类Circle的定义 派生类Rectangle的定义