try 使用:
if(NewType* v = dynamic_cast<NewType*>(old)) {
// old was safely casted to NewType
v->doSomething();
}
这要求编译器启用rtti支持.
编辑:
每次你需要使用动态投射(或instanceof)时,你最好问问自己这是否是必要的.这通常是设计拙劣的标志.
典型的解决方法是将要判断的类的特殊行为放入基类上的一个虚拟函数中,或者可能引入类似于visitor的东西,在其中可以在不更改接口的情况下为子类引入特定行为(当然,除了添加访问者接受接口).
正如前面所指出的,dynamic_cast并不是免费提供的.处理大多数(但不是所有)情况的一个简单且持续执行的hack基本上是添加一个枚举,表示类可以拥有的所有可能类型,并判断您是否得到了正确的类型.
if(old->getType() == BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
这不是一个好的oo设计,但它可以是一个变通方法,其成本或多或少只是一个虚拟函数调用.无论RTTI是否启用,它都可以工作.
请注意,这种方法不支持多级继承,因此如果不小心,可能会以如下代码结尾:
// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}