文档介绍:第13章多态性与虚函数
普通成员函数重载
派生类指针
虚函数
纯虚函数与抽象类
多态性是面向对象程序设计的重要特征之一。所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。C++的多态性具体体现在运行和编译两个方面,在程序运行时的多态性通过继承和虚函数来体现,而在程序编译时多态性体现在函数和运算符的重载上。
普通成员函数重载
在C++语言中,只有在声明函数原型时形式参数的个数或者对应位置的类型不同,两个或更多的函数就可以共用一个名字。这种在同一作用域中允许多个函数使用同一函数名的措施被称为重载(overloading)。函数重载是C++程序获得多态性的途径之一。
函数重载的方法
函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,既采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型不同。否则,将无法实现函数重载。
#include <>
int square(int x)
{
return x*x;
}
double square(double y)
{
return y*y;
}
main()
{
cout<<”The square of integer 7 is”<<square(7)<<endl;
cout<<” The square of double is”<<square()<<endl;
return 0;
}
例13-1:给出以下程序的运行结果。
此程序的运行结果为:
The square of integer 7 is 49
The square of integer is
#include <>
const double PI=;
double length(float r)
{
return 2*PI*r;
}
double length(float x,float y)
{
return 2*(x+y);
}
例13-2:用重载函数实现求圆和矩形的周长。
void main()
{
float a,b,r;
cout<<”输入圆半径:”;
cin>>r;
cout<<”圆周长:”<<length(r)<<endl;
cout<<”输入矩形长和宽:”;
cin>>a>>b;
cout<<”矩形周长:”<<length(r)<<endl;
}
函数重载的表示形式
普通成员函数重载可表达为两种形式:
1. 在一个类说明中重载
例如: Show ( int , char ) ;
Show ( char * , float ) ;
2. 基类的成员函数在派生类重载。有3种编译区分方法
(1)根据参数的特征加以区分
例如: Show ( int , char ) 与
Show ( char * , float )
不是同一函数,编译能够区分
(2)使用“:: ”加以区分
例如: A :: Show ( )
有别于 B :: Show ( )
(3)根据类对象加以区分
例如: ( )调用 A :: Show ( )
( )调用 B :: Show ( )
函数重载的注意事项
在C++语言中,编译程序选择相应的重载函数版本时函数返回值类型是不起作用的。不能仅靠函数的返回值来区别重载函数,必须从形式参数上区别开来。例如:
void print(int a);
void print(int a,int b);
int print(float a[]);
这三个函数是重载函数,因为C++编译程序可以从形式参数上将它们区别开来。
但: int f(int a);
double f(int a);
这两个函数就不是重载函数,编译程序认为这是对一个函数的重复说明,因为两个函数的形式参数个数与相应位置的类型完全相同。
由typedef定义的类型别名并没有真正创建一个新的类型,所以以下程序段:
typedef double money;
double calculate(double e);
money calculate(money e);
也是错误的函数重载。
同样道理,不同参数传递方式也无法区别重载函数,如:
void func(int value);
void func(int &value);
也不能作为重载函数。
在程序中不可滥用函数重载,不适当的重载会降低程序的可读性。C++语言并没有