我有一个像
这样的课程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。并非所有形状都是三角形,但为什么我不能明确地制作这个角色呢?前瞻性声明是否与问题有关?
答案 0 :(得分:1)
我试图将传递给Shapeshift方法的Shape类型更改为与同一函数中的字符串参数匹配的指针
安全演员阵容为dynamic_cast
:
dynamic_cast<Triangle*>(shape);
如果shape
是Triangle*
,则此操作将成功,表达式的结果将是有效指针。否则,它将是一个空指针。
不安全的演员阵容将是static_cast
:
static_cast<Triangle*>(shape);
如果shape
恰好不是Triangle*
,那么这将是未定义的行为,但无论是否为{null}都是非空指针(只要shape
非空)。 / p>
答案 1 :(得分:0)
由于(Triangle *)shape
不是可修改的l值,因此您无法为其指定值
你可能想做的是
triangle = (Triangle*)shape;
请勿使用C-Style演员,因为它们会阻止您遇到多个运行时错误
在这种情况下,最好使用dynamic_cast
。