方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分

Is method overriding (without virtual methods or pointers) considered a part of Polymorphism?

本文关键字:方法 是否 认为是 多态性 一部分 指针 重写 虚拟      更新时间:2023-10-16

首先,我想说我搜索了类似的问题,但答案似乎集中在不同的事情上。

我开始学习C++,但我很难理解什么是多态性。我写了两个不同的程序。

在第一种情况下,我不使用虚拟方法或指向对象的指针。

在第二个例子中,我使用了一个虚拟方法(区域)和一个带有指向对象的指针的数组。

我知道第二个程序使用多态性(父类指针用于指向子类对象)。

但是,由于第一个程序通过覆盖功能区产生了完全相同的结果,它是否也被认为使用了多态性?

程序1

#include <iostream>
using namespace std;
class Polygon {
protected:
    float base;
    float height;
public:
    Polygon(): base(0), height(0) {}
    Polygon(float b, float h): base(b), height(h) {}
    float area() {return -1;}
};
class Triangle:public Polygon {
public:
    Triangle(): Polygon() {}
    Triangle(float b, float h): Polygon(b,h) {}
    float area() {return base*height/2;}
};
class Rectangle:public Polygon {
public:
    Rectangle(): Polygon() {}
    Rectangle(float b, float h): Polygon(b,h) {}
    float area() {return base*height;}
};
int main() {
    //Overriding area method without pointers
    Triangle t1, t2(10,10);
    Rectangle r1, r2(5,5);
    cout<<t1.area()<<endl;  //Output: 0
    cout<<t2.area()<<endl;  //Output: 50
    cout<<r1.area()<<endl;  //Output: 0
    cout<<r2.area()<<endl;  //Output: 25
    cout<<t1.Polygon::area()<<endl; //Output: -1
}

程序2

#include <iostream>
using namespace std;
class Polygon {
protected:
    float base;
    float height;
public:
    Polygon(): base(0), height(0) {}
    Polygon(float b, float h): base(b), height(h) {}
    virtual float area() {return -1;} //virtual method area
};
class Triangle:public Polygon {
public:
    Triangle(): Polygon() {}
    Triangle(float b, float h): Polygon(b,h) {}
    float area() {return base*height/2;}
};
class Rectangle:public Polygon {
public:
    Rectangle(): Polygon() {}
    Rectangle(float b, float h): Polygon(b,h) {}
    float area() {return base*height;}
};
int main() {
    //Polymorphism
    Triangle t1, t2(10,10);
    Rectangle r1, r2(5,5);
    Polygon *ptr[]={&t1,&t2,&r1,&r2};
    cout<<ptr[0]->area()<<endl;  //Output: 0
    cout<<ptr[1]->area()<<endl; //Output: 50
    cout<<ptr[2]->area()<<endl; //Output: 0
    cout<<ptr[3]->area()<<endl; //Output: 25
    cout<<ptr[0]->Polygon::area()<<endl;    //Output: -1
}

但是,由于第一个程序通过覆盖功能区产生了完全相同的结果,它是否也被认为使用了多态性?

没有。在第一个示例中没有覆盖的,而是隐藏基类函数实现。


您的示例产生相同的结果是因为在您的第一个示例中

    cout<<t1.area()<<endl;  //Output: 0
    cout<<t2.area()<<endl;  //Output: 50
    cout<<r1.area()<<endl;  //Output: 0
    cout<<r2.area()<<endl;  //Output: 25

您正在用具体的类实例调用函数。

类似的东西

    Polygon *ptr[]={&t1,&t2,&r1,&r2};
    cout<<ptr[0]->area()<<endl;  //Output: 0
    cout<<ptr[1]->area()<<endl; //Output: 50
    cout<<ptr[2]->area()<<endl; //Output: 0
    cout<<ptr[3]->area()<<endl; //Output: 25

将无法与此代码一起使用。


多态性意味着您已经声明了一些接口,这些接口可以通过基类引用访问。

在c++中,您通常可以选择

  • 动态多态性(即抽象/虚拟基类)和在运行时解析重写的函数调用
  • 静态多态性(即在编译时使用CRTP来解析重写的函数调用)