0

完成第一卷。在 Bruce Eckel 的 Thinking in C++ 中,我已经开始阅读第 2 卷。专门讨论RTTI(运行时类型识别)的那一章最让我吃惊。我一直在阅读关于tyepid,dynamic_cast等的内容。

但是,我有一个问题浮现在我的脑海中。他们是否有任何通过上述运营商进行开发的实际用途,RTTI即来自现实项目的一些例子?此外,遇到哪些限制使其需要使用?

4

2 回答 2

1

dynamic_cast 可用于添加可选功能


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

  cs->DoCoolStuff();
}

当您从头开始设计时,可能会在不支持它的类中DoEvenCoolerStuff放入ICoolStuff并拥有空实现,但是当您需要更改现有代码时通常不可行。

另一种用途是消息系统实现,其中可能使用 dynamic_cast 来区分您感兴趣的消息。更一般地说,当您遇到表达式问题时可能需要它。

于 2013-07-08T16:00:44.350 回答
0

我在旅行中看到的生产代码中最常见的 RTTI 示例是dynamic_cast,但它几乎总是被用作糟糕设计的创可贴。

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

话虽如此,在某些情况下,即使dynamic_cast是创可贴,它仍然是两害相权取其轻。当“修复”损坏的设计意味着大型维护项目并且不会影响性能时,尤其如此。假设您有 1 个 MLOC 应用程序,并且修复在学术上被破坏的东西将意味着必须接触 10 万行代码。如果没有性能方面的原因进行更改,那么您只是为了修复它而修复它,但是您冒着创建数十或数百个新错误的风险。这可能不值得。

于 2013-07-08T15:55:34.437 回答