在C#中,您可以使用as转换类型或获取null:
Object o = Whatever();
String s = o as String;
Run Code Online (Sandbox Code Playgroud)
有没有类似的简单方法在C++中实现这一点?
我正在使用Visual Studio 2010,如果这很重要的话.
[更新]:请记住,铸造和使用之间存在非常重要的区别as.如果类型不匹配,则转换(至少在C#中)将抛出异常:
Object o = null;
String s = (String)o; // Will crash.
Run Code Online (Sandbox Code Playgroud)
在C++中,这将是一个dynamic_cast,如果你有一个层次结构,其中Object是父级,String是子级.
Object * p = createMyObject();
String * s = dynamic_cast<String *>(p);
if(s)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果可以进行强制转换,动态转换指针将返回指向对象的指针,否则返回空指针.
此外,如果可以进行强制转换,动态转换引用将返回对象的引用,或者抛出异常.
小智 5
在C++中没有基础对象类,因此通常无法做到这一点.但是,您可以针对特定层次结构执行此操作:
struct A {
virtual ~A() {}
};
struct B : public A {
};
A * p = Something(); // Something() may return an A * or a B *
B & b = dynamic_cast <B&>(*p);
Run Code Online (Sandbox Code Playgroud)
如果p没有指向可以安全地转换为B引用的内容,则动态转换将抛出异常.