如何过滤继承的对象?

How to filter inherited objects?

我有 class Set,它由动态分配的 IShape 组成,其中 IShape 由 Square、Rectangle 等继承,我需要创建过滤器函数来创建只有特定类型的新集合(例如正方形)。基本上是通过现有的集合并只选择以某种方式定义的形状(通过参数?)并创建该形状的新集合。这怎么可能?

为了避免使用 dynamic_cast,让你的 IShape class 声明一个名为(比如说)GetTypeOfShape 的纯虚函数。然后在每个派生的 classes 中将其覆盖为 return 每个代表的形状类型(例如 enum)。然后你可以在你的过滤器函数中测试它并相应地进行。

示例代码:

#include <iostream>

class IShape
{
public:
    enum class TypeOfShape { Square, Rectangle /* ... */ };
    
public:
    virtual TypeOfShape GetTypeOfShape () = 0;
};

class Square : public IShape
{
public:
    TypeOfShape GetTypeOfShape () override { return TypeOfShape::Square; } 
};

class Rectangle : public IShape
{
public:
    TypeOfShape GetTypeOfShape () override { return TypeOfShape::Rectangle; } 
};

// ...

int main ()
{
    Square s;
    Rectangle r;
    
    std::cout << "Type of s is: " << (int) s.GetTypeOfShape () << "\n";
    std::cout << "Type of r is: " << (int) r.GetTypeOfShape () << "\n";
}

输出:

Type of s is: 0
Type of r is: 1

Live demo