向前声明指向更具体类型的指针

时间:2015-01-28 03:26:21

标签: c++ polymorphism

我有一个像

这样的课程
class Shape;
class Triangle;
class Amorpher
{
public:
    Amorpher();
    Amorpher(Shape*);
    Amorpher(Shape&);
    ~Amorpher();
    Shape* pShape;
    void GetShapeArea();
    void Shapeshift(Shape&, string);
    void Shapeshift(Shape*, string);
private:
    Triangle* triangle;
};

和实施

Amorpher::Amorpher()
{
}
Amorpher::Amorpher(Shape* shape) : pShape(shape){}
void Amorpher::GetShapeArea()
{
    cout << "shape area is: " << pShape->Area();

}

Amorpher::~Amorpher()
{
}
void Amorpher::Shapeshift(Shape* shape,string shiftTo)
{
    if (shiftTo == "triangle")
    {
        (Triangle*)shape = triangle;
    }
}

三角形继承自形状。我想在Shapeshift方法中尝试将传递给方法的Shape转换为Triangle。并非所有形状都是三角形,但为什么我不能明确地制作这个角色呢?前瞻性声明是否与问题有关?

2 个答案:

答案 0 :(得分:1)

  

我试图将传递给Shapeshift方法的Shape类型更改为与同一函数中的字符串参数匹配的指针

安全演员阵容为dynamic_cast

dynamic_cast<Triangle*>(shape);

如果shapeTriangle*,则此操作将成功,表达式的结果将是有效指针。否则,它将是一个空指针。

不安全的演员阵容将是static_cast

static_cast<Triangle*>(shape);

如果shape恰好不是Triangle*,那么这将是未定义的行为,但无论是否为{null}都是非空指针(只要shape非空)。 / p>

答案 1 :(得分:0)

由于(Triangle *)shape不是可修改的l值,因此您无法为其指定值 你可能想做的是

triangle = (Triangle*)shape;

请勿使用C-Style演员,因为它们会阻止您遇到多个运行时错误 在这种情况下,最好使用dynamic_cast