多态性概述

版权声明:小简原创 https://blog.csdn.net/qq_43469554/article/details/87446366

多态性是面向对象程序设计的重要特性之一,从字面意思上可以简单理解就是:多种形态,多个样子。其实本质意思也是这样,在面向对象程序设计中,指同样的方法被不同对象执行时会有不同的执行效果。

在具体来说,多态的实现又可以分为两种:编译时多态和运行时的多态。前者是编译的时候就确定了具体的操作过程。后者呢是在程序运行过程中才确定的操作过程。这种确定操作过程的就是联编,也称为绑定。

联编在编译和连接时确认的,叫做静态联编,前面我们学习的函数重载、函数模板的实例化就属于这一类。

下面,我们围绕静态联编,给大家举一个简单例子:


#include <iostream>
using namespace std;
#define PI 3.1415926
  
class Point
{
private:
    int x,y;
  
public:
    Point(int x=0,int y=0)
    {
        this->x = x;
        this->y = y;
    }
    double area()
    {
        return 0.0;
    }
};
class Circle:public Point
{
private:
    int r;
public:
    Circle(int x,int y,int R):Point(x,y)
    {
        r = R;
    }
    double area()
    {
        return PI*r*r;
    }
};
  
int main()
{
  
    Point A(10,10);
    cout<<A.area()<<endl;
    Circle B(10,10,20);
    cout<<B.area()<<endl;
    Point *p;
    p = &B;
    cout<<p->area()<<endl;
    Point &pp=B;
    cout<<pp.area()<<endl;
    return 0;
  
}

在这里插入图片描述
第一个cout输出A的面积,是Point类中的area方法,面积为0,没有问题。

第二个cout输出B的面积,很明显是派生类Circle的area方法,面积自然按公式计算得出1256.64的值,也没问题。

第三个cout输出的是Point类型指针p指向的Circle类对象的area方法,它输出了0很明显是执行了Point类里的area方法。这里C++实行的是静态联编,即在编译的时候就依据p的类型来定执行哪个area,因此是0

第四种cout也同理,把Circle类型的对象赋给Point类型的引用,C++同样实行静态联编,也输出0

很明显,这不是我们更期望的结果,实际上,对于指针、引用,我们更希望执行实际对象的方法,而不是因为这个指针、引用的类型而盲目的确定。这就是如果这么写存在的问题。

猜你喜欢

转载自blog.csdn.net/qq_43469554/article/details/87446366