第五章多态性
1 第五章 多态性
5.1编译时的多态性与运行时的多态性 多态性是指用同一个名字定义不同的函数,这些函数执行不同但 又类似的操作。 联编的概念: 个源程序经过编译、连接、成为可执行文件的过程是把可执行 代码联编(或称装配)在一起的过程。 静态联编(前期联编) 静态联编要求在程序编译时就知道调用哪个函数,就决定如何 实现某一动作。 动态联编(后期联编、滞后联编) 直要到程序运行时才能确定调用哪个函数。系统在运行时才动 态完成的联编。 静态联编支持的多态性称为编译时多态性,也称静态多态性。在 C++中,编译时多态性是通过函数重载和运算符重载实现的。 动态联编支持的多态性称为运行时多态性,也称动态多态性。在 C++中,运行 时多态性是通过继承和虚函数来实现的
2 5.1 编译时的多态性与运行时的多态性 多态性是指用同一个名字定义不同的函数,这些函数执行不同但 又类似的操作。 联编的概念: 一个源程序经过编译、连接、成为可执行文件的过程是把可执行 代码联编(或称装配)在一起的过程。 静态联编(前期联编) 静态联编要求在程序编译时就知道调用哪个函数,就决定如何 实现某一动作。 动态联编(后期联编、滞后联编) 一直要到程序运行时才能确定调用哪个函数。系统在运行时才动 态完成的联编。 静态联编支持的多态性称为编译时多态性,也称静态多态性。在 C++中,编译时多态性是通过函数重载和运算符重载实现的。 动态联编支持的多态性称为运行时多态性,也称动态多态性。在 C++中,运行 时多态性是通过继承和虚函数来实现的
5.2函数重载 编译时多杰性可以通过函数重载来实现。函数重载的意义在于它能 Void main( point p(20, 20) circle c(8, 8, 30) cout<<. area(<<end;∥:行基类pont中的area()的函数 cout<<carea0<endl;∥:行派生类crce中的area()函数 cout<<c. point:area(<<endl;/执行基类 point的area()的函数 程序运行结果为: 0 2827439941 class circle: public point int radius: public circle(int x, int y int rad): point(x,yradius=rad; float area( [return3,1416 radius radius;派生类中的area函数
3 5.2 函数重载 编译时多态性可以通过函数重载来实现。函数重载的意义在于它能 用同一个名字访问一组相关的函数,也就是说,能使用户为某一 类操作取一个通用的名字,而由编译程序来选择具体由哪个函数 来执行,因而有助于解决程序的复杂性问题。普通成员函数和构 造函数都可以重载 例5.1 基类和派生类中函数重载的例子 #include <iostream.h> class point{ int x,y; public: point(int a,int b){x=a;y=b;} float area(){return 0.0;} //基类中的area函数 }; class circle:public point{ int radius; public: circle(int x,int y,int rad):point(x,y){radius=rad;} float area(){return 3,1416*radius*radius;}//派生类中的area函数 }; Void main() { point p(20,20); circle c(8,8,30); cout<<p.area()<<endl; //执行基类point中的area()的函数 cout<<c.area()<<endl; //执行派生类circle中的area()函数 cout<<c.point::area()<<endl;//执行基类point中的area()的函数 } 程序运行结果为: 0 2827.439941 0
说明: 在基类和派生类中的函数重载有两种情况: 1.参数有所差别的重载,这种重载函数的定义和调用方法在前面章 节已进行了介绍;在编译时根据参数不同来区分函数重载。 2.函数所带的参数完全相同,只是它们属于不同的类。这时要人工 干预,以下两种方法可以使编译时区别这类函数: 1)使用对象名加以区分。例如: parea()和 c erea()分别 调用类 point的area()函数和类crce的area()函数。 (2)使用类名加以区分。例如:pont:area()和 circle;area( 分别调用类pon和类crce的area()函数
4 说明: 在基类和派生类中的函数重载有两种情况: 1.参数有所差别的重载,这种重载函数的定义和调用方法在前面章 节已进行了介绍;在编译时根据参数不同来区分函数重载。 2.函数所带的参数完全相同,只是它们属于不同的类。这时要人工 干预,以下两种方法可以使编译时区别这类函数: (1)使用对象名加以区分。例如:p.area()和c.erea()分别 调用类point的area()函数和类circle的area()函数。 (2)使用类名加以区分。例如:point::area()和circle::area() 分别调用类point和类circle的area()函数
53运算符重载 在C++中,除了可以对函数重载外,还可以对大多数运算 符实施重载。 运算符重载通过创建运算符函数 operator()来实现。 运算符函数定义了重载的运算符将要进行的新的操作, 这种操作通常作用在一个类上。 函数 operator()可以不是类的成员函数是类的成 员函数类的友元函数
5 5.3 运算符重载 在C++中,除了可以对函数重载外,还可以对大多数运算 符实施重载。 运算符重载通过创建运算符函数operator()来实现。 运算符函数定义了重载的运算符将要进行的新的操作, 这种操作通常作用在一个类上。 函数operator()可以 不是类的成员函数 是类的成 员函数 类的友元函数