我正在使用Visual Studio并执行有效的动态投射。启用了RTTI。
编辑:更新了代码,使之更真实
struct base
{
virtual base* Clone()
{
base* ptr = new base;
CopyValuesTo( ptr );
return ptr;
}
virtual void CopyValuesTo( base* ptr )
{
...
}
virtual ~base()
{
}
}
struct derived : public base
{
virtual base* Clone()
{
derived* ptr = new derived;
CopyValuesTo( ptr );
return ptr;
}
virtual void CopyValuesTo( base* ptr )
{
...
}
virtual ~derived()
{
}
}
void Class1::UseNewSpec( base* in_ptr ) //part of a totally unrelated class
{
derived* ptr = dynamic_cast<derived *>(in_ptr);
if( !ptr )
return;
delete m_ptr;
m_ptr = ptr->Clone(); //m_ptr is a member of Class1 of type base*
}
//usage :
Class1 obj;
derived new_spec;
obj.UseNewSpec( &new_spec );
我的调试器说,抛出异常时,in_ptr的类型正确。 Google似乎无济于事。有任何想法吗?干杯。
我根据您的伪代码运行了一个测试,它可以正常工作。因此,如果在构建配置中真正启用了RTTI,那么它一定是您发布的内容中未捕获的另一个问题。
[https://docs.microsoft.com/en-us/cpp/cpp/typeid-operator?view=vs-2019具有有关__non_rtti_object_exception的信息。
从MSDN:
如果指针未指向有效对象,会抛出__non_rtti_objectexception,指示尝试分析RTTI触发故障(例如访问违反),因为对象是某种程度上无效(指针错误或代码未使用/ GR进行编译。)>
RTTI dynamic_cast周围的异常,故障或错误可能意味着您执行了非法转换。当且仅当类dynamic_cast<derived*>(ptrToBase)
和类derived
都满足以下约束时,base
有效:该类或其基类之一具有虚拟成员函数。
请确保在所有源文件中都启用了RTTI。
base
是否包含任何virtual
方法?必须使dynamic_cast
起作用。