c++ - 两个 dynamic_cast 问题

标签 c++ dynamic-cast

  1. 您会在频繁运行的方法中使用动态转换吗?有没有 开销很大?

  2. dynamic_cast 返回的指针到底是什么。指向同一地址的指针? 指向不同实例的指针?我缺乏这种理解。更具体地说—— 只有在运行时,我才希望对父类型的指针进行赋值 原来是一个指向儿子类型的指针。解决方案?

谢谢。

最佳答案

dynamic_cast 帮助您在执行向下转换时检查有效性。

如果指针或引用不能安全向下转型,它返回 NULL 或抛出异常(std::bad_cast 用于引用)。

您会在频繁运行的方法中使用动态转换吗?开销大吗? dynamic_cast 确实使用一些额外的 RTTI(运行时类型信息) 来确定转换的有效性。所以肯定有开销。通常,指向类型typeinfo 的指针将添加到虚拟表。我说通常,因为虚拟机制本身是依赖于编译器实现的细节(可能因不同的编译器而异)。

您必须使用一些好的分析工具来分析您的代码,以确定重复调用 dynamic_cast 是否会降低代码的性能。

dynamic_cast 返回的指针到底是什么。指向同一地址的指针?指向不同实例的指针?

如果不使用dynamic_cast 分析向下转型,而是分析向上转型,则更容易理解。给定类型 base 和另一个继承自 base 的类型 derivedderived 类型将包含类型的子对象基础。当指向 derived 对象的指针被向上转换为指向 base 的指针时,操作的结果将是 base 子对象的地址 < em>内部 派生。执行 dynamic_cast 会恢复该操作,并返回指向 derived 对象的指针,该对象在作为参数传递的地址中包含 base 子对象(static_cast 做同样的事情,但它会应用可能的偏移量而不实际检查运行时类型。

在最简单的情况下,在单(非虚拟)继承的情况下,derived 子对象将与 base 对齐,但在多重继承的情况下,则不会案例:

struct base {
   int x;
   virtual void foo() {}
};
struct another_base {
   virtual void bar() {}
};
struct derived : base, another_base {};
int main() {
   derived d;
   base * b = &d;           // points to the base subobject inside derived
   another_base * o = &d;   // points to the another_base subobject inside derived

   std::cout << std::boolalpha
       << ( static_cast<void*>(b) == dynamic_cast<derived*>(b) ) << "\n"
       << ( static_cast<void*>(o) == dynamic_cast<derived*>(o) ) << std::endl;
}

程序将打印truefalse。请注意,如果要比较它们,您必须将其中一个指针显式转换为 void*,否则编译器将对向下转换 指针执行隐式向上转换。 p>

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

相关文章:

c++ - 继承类在这种情况下如何工作???

c++ - 指针和字符串长度

c++ - 带接口(interface)的动态转换

c++ - dynamic_cast 一个非常量引用到一个常量引用。 cppreference.com 的解释似乎很奇怪

c++ - 如何在编译时将整数模板参数修改为非零?

c++ - 如何停止对 QThread 的长时间操作?

c++ - Dlib人脸识别,多张图片检测

c++ - 命名空间 'std' 中的“bad_cast”未命名类型错误

java - 在这种情况下有什么办法可以避免 if-else 和动态转换吗?

c++ - 动态转换和静态转换的奇怪行为