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

时间:2016-04-29 17:42:45

标签: c++ object inheritance polymorphism

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

我开始学习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
}

1 个答案:

答案 0 :(得分:3)

  

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

嗯,不。第一个示例中没有 覆盖 ,但是基类函数实现的阴影。

你的例子产生相同的结果是因为你的第一个样本中的事实

    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

would fail与此代码一起使用。

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

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

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