gpt4 book ai didi

c++ - 避免 dynamic_cast/RTTI

转载 作者:可可西里 更新时间:2023-11-01 16:54:32 25 4
gpt4 key购买 nike

我最近正在为一个副项目(cpp-markdown library,出于好奇)编写一段 C++ 代码,遇到了一个编码问题,我想听听一些意见。

cpp-markdown 有一个名为 Token 的基类,它有许多子类。两个主要的子类是 Container(包含其他 Token 的集合)和 TextHolder(用作 Token 的基类当然是包含文本的)。

大部分处理是通过虚函数处理的,但其中一些处理在单个函数中处理效果更好。为此,我最终使用 dynamic_cast 将指针从 Token* 向下转换为它的子类之一,这样我就可以调用特定于子类的函数,并且它的子类。转换不可能失败,因为代码能够通过虚函数(例如 isUn​​matchedOpenMarker)判断何时需要这样的事情。

还有另外两种方法可以解决这个问题:

  1. 创建 所有 我想调用的函数作为 Token 的虚函数,并且只为每个子类留下一个空体,除了那个(s) 需要处理它们,或者...

  2. Token 中创建一个虚函数,当在某些子类型上调用它时,它将返回指向 this 的正确类型的指针,如果被调用,则返回一个空指针还要别的吗。基本上是我已经在那里使用的虚拟功能系统的扩展。

在我看来,第二种方法似乎比现有方法和第一种方法都好。但我想知道其他有经验的 C++ 开发人员对此的看法。或者我是否为琐事担心太多。 :-)

最佳答案

#1 为不需要它的对象污染类命名空间和 vtable。好吧,当你有一些通常会被实现的方法时,但是当只需要一个派生类时就很丑陋了。

#2 只是 dynamic_cast<>穿着圆点连衣裙,涂着口红。不会使客户端代码变得更简单,并且会缠绕整个层次结构,要求基类和每个派生类都半知晓所有其他派生类。

只需使用 dynamic_cast<> .这就是它的用途。

关于c++ - 避免 dynamic_cast/RTTI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/580270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com