这是一个编译和运行的明显简单的示例。
#include <iostream>
#include <vector>
using namespace std;
class Shape {
public:
virtual double getArea() = 0;
};
class Circle : public Shape {
public:
double getArea() {return 3.14;}
};
class Rectangle : public Shape {
public:
double getArea() {return 42.0;}
};
int main() {
vector<Shape*> shapes = {new Circle(), new Rectangle()};
for (Shape* s : shapes) { cout << s->getArea() << endl;}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是它将打印向量中的每个形状。
我不知道该怎么做是按派生类类型过滤向量。例如,如何迭代向量并只对每个 Circle 执行某些操作?
谢谢
首先,如果您想将圆形与其他形状区别对待,您应该考虑将它们与其他形状分开存储。
但有时您希望在大多数时间对所有形状执行相同的操作,而有时对圆形执行特殊操作。
在这种情况下,您需要进行动态向下转换以从 to 指针获取到Shapeto 指针Circle。如果Shape它指向的不是一个圆,这将失败并产生一个空指针。
class Circle : public Shape {
public:
double getArea() {return 3.14;}
void circlesOnly() { std::cout << "Whee! I'm a circle!\n"; }
};
vector<Shape*> shapes = {new Circle(), new Rectangle()};
for (Shape *shape : shapes) {
if (Circle *c = dynamic_cast<Circle *>(shape); c != nullptr)
c->circlesOnly();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |