首先,我想说我搜索了类似的问题,但答案似乎集中在不同的事情上。
我开始学习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
}
答案 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 ++中,您通常可以选择