如何过滤继承的对象?
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
我有 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