6

类型检查仅仅是整数比较吗?GetTypeId或者有一个虚函数来区分哪个会使其成为整数比较是否有意义?

(只是不希望事情成为类名的字符串比较)

编辑:我的意思是,如果我经常期待错误的类型,那么使用以下内容是否有意义:

struct Token
{
    enum {
        AND,
        OR,
        IF
    };
    virtual std::size_t GetTokenId() = 0;
};

struct AndToken : public Token
{
    std::size_t GetTokenId() { return AND; }
};

并使用GetTokenId成员而不是依赖dynamic_cast.

4

4 回答 4

6

的功能dynamic_cast远远超出了简单的类型检查。如果它只是一个类型检查,它会很容易实现(就像你在原始帖子中所拥有的那样)。

除了类型检查之外,dynamic_cast还可以执行转换void *和分层交叉转换。从概念上讲,这些类型的转换需要一些在两个方向(向上和向下)遍历类层次结构的能力。支持这种类型转换所需的数据结构比单纯的标量类型 id 更复杂。正在使用的信息dynamic_cast是 RTTI 的一部分。

试图在这里描述它会适得其反。我曾经有一个很好的链接,描述了 RTTI 的一种可能实现......将尝试找到它。

于 2010-07-23T02:30:26.223 回答
1

我不知道确切的实现,但这里有一个想法我会怎么做:

转换 from Derived*toBase*可以在编译时完成。两个不相关的多态类型之间的转换也可以在编译时完成(只返回 NULL)。

转换 from Base*toDerived*需要在运行时完成,因为可能有多个派生类。动态类型的识别可以使用绑定到对象的虚方法表来完成(这就是它需要多态类的原因)。

此 VMT 可能包含有关基类及其数据偏移量的额外信息。这些数据偏移在涉及多重继承时是相关的,并被添加到源指针以使其指向正确的位置。

如果在基类中找不到所需的类型,则dynamic_cast返回 null。

于 2012-08-27T15:03:27.650 回答
1

在某些原始编译器中,您是正确的,他们使用了字符串比较。

结果 dynamic_cast<> 非常慢(相对而言),因为类层次结构向上/向下遍历层次结构链的每一步都需要与类名进行字符串比较。

这导致很多人开发自己的铸造技术。这几乎总是最终是徒劳的,因为它需要正确注释每个类,并且当出现问题时,几乎不可能追踪错误。

但这也是古老的历史。

我不确定它现在是如何完成的,但它绝对不涉及字符串比较。自己做也是一个坏主意(永远不要做编译器已经在做的工作)。您所做的任何尝试都不会像编译器那样快或准确,请记住,多年的发展已经使编译器代码尽可能快(并且它总是正确的)。

于 2010-07-23T04:15:48.270 回答
0

编译器无法预测您可能拥有的其他信息并将其粘贴在 dynamic_cast 中。如果您知道代码的某些不变量,并且可以证明您的手动转换机制更快,请自己动手。在这种情况下如何实现 dynamic_cast 并不重要。

于 2010-07-23T06:09:42.827 回答