在C++中用C#'作为'命令的等价物?

Sam*_*Sam 5 c++

在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)

sma*_*uck 9

在C++中,这将是一个dynamic_cast,如果你有一个层次结构,其中Object是父级,String是子级.

Object * p = createMyObject();
String * s = dynamic_cast<String *>(p);
if(s)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果可以进行强制转换,动态转换指针将返回指向对象的指针,否则返回空指针.

此外,如果可以进行强制转换,动态转换引用将返回对象的引用,或者抛出异常.

  • 你的语法错了.应该是:`dynamic_cast <String*>(p);`你应该注意String必须从Object派生. (4认同)
  • 作为Neil所说的扩展,没有通用的基类,C++中的所有类都自动派生出来.有些库确实有这样的中心类,比如Qt和wxWidgets,但这些是直接或通过另一个类显式派生的. (3认同)

小智 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引用的内容,则动态转换将抛出异常.