在 C++ 中,过滤多态派生类向量的正确方法是什么?

Max*_*Wen 1 c++

这是一个编译和运行的明显简单的示例。

#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 执行某些操作?

谢谢

Jer*_*fin 5

首先,如果您想将圆形与其他形状区别对待,您应该考虑将它们与其他形状分开存储。

但有时您希望在大多数时间对所有形状执行相同的操作,而有时对圆形执行特殊操作。

在这种情况下,您需要进行动态向下转换以从 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)

  • 这是正确的。哦,稍微相关一点:你的“Shape”还应该有一个虚拟 dtor,比如“virtual ~shape() = default;” (3认同)