方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
Is method overriding (without virtual methods or pointers) considered a part of 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
}
但是,由于第一个程序通过覆盖功能区产生了完全相同的结果,它是否也被认为使用了多态性?
没有。在第一个示例中没有覆盖的,而是隐藏基类函数实现。
您的示例产生相同的结果是因为在您的第一个示例中
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来解析重写的函数调用)
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- c++ 中的抽象方法是否曾经调用过?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 当元组给出参数时,如何检查方法是否存在?
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 在方法中调用方法是否会导致开销
- 在移出向量上调用 size() 方法是否安全?
- 此工厂方法是否会导致争用条件?
- 这种方法是否对分支的预测产生了影响
- 检查启发式方法是否兼容
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- const 类方法是否阻止在类外部分配变量?