在C++; 用C++做了第一的C++思想,我开始读第二卷。《代码> RTTI (运行时类型识别)一章最让我吃惊。我一直在读关于tyepid,dynamic\u cast等的书

在C++; 用C++做了第一的C++思想,我开始读第二卷。《代码> RTTI (运行时类型识别)一章最让我吃惊。我一直在读关于tyepid,dynamic\u cast等的书,c++,casting,rtti,typeid,C++,Casting,Rtti,Typeid,但是,我脑子里有一个问题。他们是否通过上述运营商(即一些来自实际项目的示例)实际利用RTTI?另外,使用它所遇到的局限性是什么? < P>,我在旅行中见过的RTI代码中最常见的例子是 DyrimixCase,但它几乎总是用作一个不良设计的创可贴。 dynamic_cast主要用于多态类,然后用于从基类到派生类。但是想想看。如果有一个指向正确设计的多态类的基指针,那么为什么需要指向派生类型的指针呢?从理论上讲,您应该只需要调用virtual函数,并让实际的实例化处理实现细节 现在有这样的情况,即使

但是,我脑子里有一个问题。他们是否通过上述运营商(即一些来自实际项目的示例)实际利用
RTTI
?另外,使用它所遇到的局限性是什么?

< P>,我在旅行中见过的RTI代码中最常见的例子是<代码> DyrimixCase,但它几乎总是用作一个不良设计的创可贴。

dynamic_cast
主要用于多态类,然后用于从基类到派生类。但是想想看。如果有一个指向正确设计的多态类的基指针,那么为什么需要指向派生类型的指针呢?从理论上讲,您应该只需要调用
virtual
函数,并让实际的实例化处理实现细节


现在有这样的情况,即使<代码>动态版> /代码>是一种创可贴,但它仍然是两种罪恶中较小的一种。当“修复”损坏的设计将意味着一个大型维护项目,并且不会对性能产生影响时,尤其如此。假设您有一个1 MLOC的应用程序,修复一些学术上被破坏的东西将意味着必须接触10万行代码。如果没有性能方面的原因来进行更改,那么您修复它纯粹是为了修复它,但是您有可能创建几十个或数百个新的bug。这可能不值得。

dynamic\u cast可用于添加可选功能


void foo(ICoolStuff *cs)
{
  auto ecs = dynamic_cast<IEvenCoolerStuff*>(cs);
  if (ecs != 0)
  {
    ecs->DoEvenCoolerStuff();
  }

  cs->DoCoolStuff();
}

void foo(iColStuff*cs)
{
自动ecs=动态广播(cs);
如果(ecs!=0)
{
ecs->Doevencollerstuff();
}
cs->DoCoolStuff();
}
当您从头开始设计时,可以将
DoEvenCoolerStuff
放入
ICoolStuff
中,并在不支持它的类中使用空实现,但当您需要更改现有代码时,这通常是不可行的


另一个用途是消息传递系统实现,其中可以使用动态_cast来区分您感兴趣的消息。更一般地说,当你面对困难时,你可能需要它。

实用,是的。普通,不是。对于大多数应用程序来说,它的使用应该是非常罕见的。我猜RTTI最大的用途是实现
boost::any
,它检查您
get()
的类型是否与您分配的类型相同。我从未见过也没有在任何地方使用过
typeid
,但是
动态\u cast
对于某些运行时多态性可能很有用。关于
dynamic_cast
,如果你需要使用它,它通常(但当然不总是)是一个糟糕设计的标志。下面是一个使用
typeid
的示例-
if(auto ecs=dynamic_cast(cs)){ecs->doevencollerstuff();}
是的,我知道,但这并不重要。理论上,主流语言中的表达式问题并没有解决方案,你们可能需要的不仅仅是虚拟函数来进行足够好的设计。仍然可以说DyrimiSkyCube是一个设计不良的系统的创可贴。约翰·迪布林:坦率地说,我多次听到这种“糟糕的设计”的说法。但与此同时,对于典型的日常问题,我还没有看到任何好的解决方案,例如,当我将一个
派生的
对象放在一个多态容器中时(比如说,它存储
Base*
指针)。现在,我希望将我的
派生的
对象恢复为
派生的
。没有石膏我怎么能做到?这实际上是一个反问句。在没有C++的OOP中,OOP仅适用于简单的实验室级实例。任何严肃的实际编程都需要强制转换,而且没有办法解决。@JohnDibling+1表示
动态强制转换
,但是关于
typeid
的任何特定注释?动态强制转换对于依赖于对象类型的操作是必要的,因为这些操作不属于基类的虚拟成员。也就是说,当对象的行为取决于它是什么类时,只需添加一个虚拟方法。当第三方对象的行为取决于某个对象是什么类时,该第三方类应该使用动态强制转换。