gpt4 book ai didi

C++基于变量向下转换为派生类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:50 25 4
gpt4 key购买 nike

假设我有一个基类“Shape”和派生类“Triangle”、“Square”和“Circle”。“Shape”的成员是一个 int “shapeType”。

如果shapeType==1,则为三角形。如果 shapeType==2,那么它就是一个正方形。如果 shapeType==3,则为圆形。

如果有一种方法可以通过使用 shapeType 值“动态”向下转换为正确的派生类,我很想知道我只有一个曾经是派生对象的“Shape”对象。

我知道我可以写一个硬编码的 switch 语句,大致如下:

Triangle* t;
Square* s;
Circle* c;

switch (shape->shapeType) {
case 1:
t = (Triangle*)shape;
case 2:
...
}

但是,以上要求我为每个派生类的可能性创建一个指针。我想知道是否有一种方法可以在不对每个类进行硬编码的情况下执行此操作,而是以某种方式确定类类型映射,其中键是 shapeType,值是类类型。

最佳答案

如果它们有虚函数,则使用dynamic_cast:

t = dynamic_cast<Triangle*>(shape);
if ( t )
{
//use t
}

但请注意:您应该尝试以几乎不需要使用 dynamic_cast 的方式定义类和虚函数。一般来说,更喜欢定义明确的接口(interface)和多态性。

举个例子

class Shape
{
public:
virtual ~Shape() {} //destructor must be virtual - important!
virtual double Area() const = 0;
};

class Triangle : public Shape
{
public:
Triangle(double a, double b, double c);
virtual double Area() const
{
//calculate area and return it!
}
};

Shape *s = new Triangle(10, 20, 30);
double aread = s->Area(); //calls Triangle::Area()

无需使用 shapeType 变量。

关于C++基于变量向下转换为派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com