问题标签 [dynamic-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
2514 浏览

c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?

几分钟前我正在回答一个问题,它向我提出了另一个问题:

在我的一个项目中,我做了一些网络消息解析。消息的形式为:

有效载荷的格式和内容由消息类型决定。我有一个基于公共类的类层次结构Message

为了实例化我的消息,我有一个静态解析方法,它Message*根据消息类型返回 a 字节。就像是:

我有时需要访问子类的方法。因为我的网络消息处理必须很快,所以我决定避免dynamic_cast<>并且我在基Message类中添加了一个方法来返回消息类型。根据这个返回值,我使用 astatic_cast<>来代替正确的子类型。

我这样做主要是因为有人告诉我这样做dynamic_cast<>很慢。但是,我不知道它到底做了什么以及它有多慢,因此,我的方法可能同样慢(或更慢)但要复杂得多。

大家觉得这个设计怎么样?这很常见吗?它真的比使用更快dynamic_cast<>吗?欢迎对一次使用时引擎盖下发生的事情进行任何详细解释dynamic_cast<>

- - 编辑 - -

既然有人问为什么:

基本上,当我收到一个帧时,我会做两件事:

  1. 我解析消息并构建Message框架内容是否有效的子类的相应实例。除了解析部分没有逻辑。
  2. 我收到 aMessage并根据 a switch(message->getType()),我static_cast<>选择正确的类型并执行任何必须对消息执行的操作。
0 投票
1 回答
3177 浏览

templates - typeid ,动态转换(upcast)和模板

我对动态转换、typeid() 和模板有一些疑问

1)为什么 typeid 不需要 RTTI ?

2) 多态类型的dynamic_cast:

  • 当我使用 RTTI 进行向下转换(Base to Derive)时 - 编译通过

    当 RTTI 关闭时 - 我收到警告(警告 C4541: 'dynamic_cast' 用于带有 /GR- 的多态类型'CBase';可能会导致不可预测的行为)

  • 当我进行向上转换(派生到基础)时,无论是否使用 RTTI - 编译都会顺利通过

我不明白为什么当我进行向上转换并且 RTTI 关闭时 - 我没有收到任何警告/错误!

3) 非多态类型的 dynamic_cast:

  • 当我使用或不使用 RTTI 进行向下转换时 - 编译失败(错误 C2683:'dynamic_cast':'CBase' 不是多态类型)

  • 当我在有或没有 RTTI 的情况下进行向上转换时 - 编译顺利通过。

如何在没有 RTTI 的非多态类型通行证上向上转换?

4) 模板函数前面的'inline' 是否有任何影响,即当编译器编译该函数并看到它是'inline' 时,它实际上会将函数视为inline 还是被忽略?

非常感谢大卫的帮助

0 投票
5 回答
2491 浏览

c++ - 更改条件中的对象类型

我在使用 dynamic_casting 时遇到了一些麻烦。我需要在运行时确定对象的类型。这是一个演示:

我想做上面的事情。我发现这样做的唯一合法方法是事先定义所有对象:

这样做的主要问题(除了必须定义一堆不会使用的对象之外)是我必须更改“人”变量的名称。有没有更好的办法?

(我不允许更改任何类(Person、Lawyer 或 Doctor),因为它们是将使用我的代码的人拥有并且不想更改的库的一部分)。

谢谢,

戴夫

0 投票
7 回答
2348 浏览

c++ - dynamic_cast的继承与使用

假设我有以下 3 个类(因为这是一个示例,它不会编译!):

我想根据某些在运行时才可用的设置创建 Derived1 或 Derived2 的实例。

由于直到运行时我才能确定派生类型,所以您认为以下做法是不好的做法吗?...

我通常读到 dynamic_cast 的用法很糟糕,但正如我所说,直到运行时我才知道要创建哪种类型。请帮忙!

0 投票
4 回答
13122 浏览

java - ClassCastException

i have two classes in java as:

at compile time it does not give error, but at runtime it displays an error : Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B

0 投票
1 回答
1260 浏览

objective-c - isMemberOfClass 与使用 == 比较类

两者之间是否有任何真正的区别:

检查是否value是一个SomeClass对象?

0 投票
2 回答
850 浏览

java - 动态转换:可比较的类和字符串

与其试图将我的问题用语言表达出来,不如用一些代码来演示我想要做什么:

有任何想法吗?我看过使用反射但没有成功。

0 投票
3 回答
3085 浏览

c++ - 不能 dynamic_cast void* 到模板类

我得到的确切错误是:

不能将'object'('void *'类型)动态转换为'class udDator(int)*'(源不是指向类的指针)

这发生在被覆盖的操作符删除中。我正在尝试创建一个模板化的内存管理类,它可以继承到任何其他类,通过引用管理内存。这将代替智能 shared_ptr 之类的东西,试图使内存管理更加不可见,并且无需额外输入( shared_ptr< someClass > shared(new someClass() )有点长......)。

无论如何,这是相关的代码。如果我忘记提及任何细节,或者没有您需要查看的代码,请告诉我。

重写运算符:

模板类:

模板类的用法:

0 投票
4 回答
3476 浏览

c++ - 如何编写自己的dynamic_cast

这在采访中被问到了。

如何编写自己的dynamic_cast。我认为,基于typeid的name函数。

现在如何实现自己的类型?我对此一无所知。

0 投票
3 回答
1245 浏览

c++ - 在派生类中实现虚函数时避免 dynamic_cast

这是一些示例代码,解释了我想要实现的目标。

基本上,我有一个算法,它依赖于类中可用的一些基本操作。我在纯抽象基类中定义了这些操作。我想将该算法应用于通过为特定对象派生类来提供这些操作的各种对象。

然而,就这些操作而言,不同的派生对象彼此不兼容。我的问题是我是否可以避免使用 RTTI 来确保例如 bool derived2::identical(const base* other2)、asserts(或其他退出机制),其中 other2 不是 derived2 类型。

一种替代方法是在特定派生对象上对函数算法进行模板化,但这意味着它的实现必须存在于我不想这样做的头文件中,因为 1) 出于测试目的更改算法代码可能会导致重新编译大部分代码 2) 算法的实现将在头文件中公开,而不是很好地存在于对最终用户隐藏的源文件中。

头文件

算法实现源文件

主程序