如何使用非const Triangle
指针成功传递尝试?
const Triangle *prim;
const GeometricPrimitive *gp;
try {
gp = dynamic_cast<const GeometricPrimitive*>(primitives[edges[axis][j].primNum].GetPtr());
prim = dynamic_cast<const Triangle*>((gp->shape).GetPtr());
}
catch (std::bad_cast& bc) {
continue;
}
template <typename T> class Reference {
public:
...
T *operator->() { return ptr; }
const T *operator->() const { return ptr; }
operator bool() const { return ptr != NULL; }
const T *GetPtr() const { return ptr; }
private:
T *ptr;
};
编辑:
答案 0 :(得分:5)
dynamic_cast
的语义在§5.2.7/ 8中描述:
如果
C
是T
指向或引用的类类型,则为运行时 检查逻辑执行如下:- 如果,在最派生的对象中 指向(引用)
v
,v
点(指)公共基础C
对象的class子对象,如果只有一个C
类型的对象 从v
结果指向(引用)的子对象派生而来 点(指)C
对象。- 否则,如果
v
指向(引用)公共基类子对象 最派生对象的类型,以及派生最多对象的类型 有一个类型为C
的基类,它是明确的,公开的, 结果点(引用)到派生最多的C
子对象 对象- 否则,运行时检查失败。
第9段:
失败的强制转换为指针类型的值是空指针 值所需的结果类型。失败的强制转换为引用类型 抛出
std::bad_cast
(18.7.2)。
注意:您应该为<typeinfo>
添加std::badcast
。
答案 1 :(得分:4)
bad_cast
:
尝试这样的事情:
Triangle prim;
GeometricPrimitive gp;
try {
gp = dynamic_cast<const GeometricPrimitive &>(*(primitives[edges[axis][j].primNum].GetPtr()));
prim = dynamic_cast<const Triangle &>(*((gp->shape).GetPtr()));
}
catch (std::bad_cast& bc) {
continue;
}