ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 概念 多态性是指具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。 # 分类 * 静态多态性 * 动态多态性 # 静态多态性 ## 概念 静态多态性采用**静态联编技术**,是指在程序编译阶段就可确定的多态性,又称为**编译时的多态性**。它有两种实现形式:**强制多态**和**重载多态**。 ## 强制多态 * 将一种类型的值强制转换成为另一种类型的值称为**类型强制**,即强制多态. * 在**基本数据类型**之间可以通过**显式**的强制类型转换实现类型强制。 ### **例子** ~~~ #include <iostream> using namespace std; ​ class A {    public:    A(int x)   {        a=x; cout<<a<<“  constructor of class A is called!\n”;   } //构造函数用于类型强制    operator int()   {        cout<<a<<“  operator int() is called!\n”; return a;   } //类型转换成员函数用于类型强制    private:    int a; }; ​ void f(const A& x) {    cout<<"function f is called!\n"; } ​ int main( ) {    A obj(1);    f(2);    obj=‘a’;    int m=obj;    return 0; } ~~~ ## 重载多态 重载实际上是给程序正文中相同作用域内的的同一个标识符赋予不同的操作语义。(参考函数重载) ### **例子** ~~~ #include <iostream.h> using namespace std; class Circle //圆形类 {    public:    Circle(double a=0.0, double b=0.0, double r=0.0)   {        x=a, y=b, radius=r;   }    double area( )   {        return 3.14159*radius*radius;   }    Circle & max(Circle &c)   {        //函数重载,求2个Circle类对象的最大值        return area( )>c.area( )? *this : c;   }    friend ostream& operator << (ostream&, Circle&);    //运算符重载,将流插入运算符'<<'重载为该类的友元函数    private:    double x,y;//圆心坐标    double radius;//半径 }; ostream& operator<<(ostream &output,Circle &c) {    output<<“center:(”<<c.x<<‘,’<<c.y<<“)\narea=”<<c.area( )<<endl;    return output; } int  main( ) {    Circle c1(1, 2, 3),c2(4, 5, 6),c3;    c3=c1.max(c2);    cout<<c3;        return 0; } ~~~ # 动态多态性 ## 概念 动态多态性采用**动态联编技术**,是指在**程序运行阶段**才能确定的多态性,又称为**运行时的多态性**。它有两种实现形式:**类型参数多态**和**包含多态**。 ## 类型参数多态 **类型参数多态**即**模板机制**来实现类属,这种方法可以直接将数据类型作为类的参数或函数的参数使用,从而可把功能上一致,而只是在参数类型上有差异的类或函数声明为一个通用类或通用函数,即形成**类模板**或**函数模板**。 ### **例子** ~~~ #include <iostream> using namespace std; ​ template<class T>         //声明类模板 class Compare {    public:    Compare(T a, T b):x(a), y(b) { }//定义函数模板    T max( )               //定义函数模板   {        return (x>y)?x:y;   }    private:    T x, y; }; int main() {    Compare <int> c1(3,7);  //定义对象c1,用于两个整数的比较    cout<<c1.max( ) << endl;    Compare <float> c2(45.78,93.6);//定义对象c2,用于两个浮点数的比较    cout<<c2.max( ) <<endl;    Compare <char> c3(’a’, ’A’); //定义对象c3,用于两个字符的比较    cout<<c3.max( ) <<endl;    return 0; } ~~~ ## 包含多态 通过虚函数(virtual function)实现的。包含多态是“一个接口,多种方法”。 ## 例子 ~~~ #include <iostream> using namespace std; ​ //声明类Point class Point {    public:    Point(float=0,float=0);    void setPoint(float,float);    float getX() const   {        return x;   }    float getY() const   {        return y;   }    friend ostream & operator<<(ostream &,const Point &);    protected:    float x,y; }; //定义Point类的成员函数 //Point的构造函数 Point::Point(float a,float b) {    x=a;y=b; } //设置x和y的坐标值 void Point::setPoint(float a,float b) {    x=a;y=b; } //输出点的坐标 ostream & operator<<(ostream &output,const Point &p) {    output<<"["<<p.x<<","<<p.y<<"]"<<endl;    return output; } int main() {    Point p(3.5,6.4);    cout<<"x="<<p.getX()<<",y="<<p.getY()<<endl;    p.setPoint(8.5,6.8);    cout<<"p(new):"<<p<<endl;    return 0; } ~~~