两个dynamic_cast问题

use*_*218 2 c++ dynamic-cast

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

  2. 究竟是dynamic_cast返回的指针是什么.指向同一地址的指针?指向不同实例的指针?我缺乏这种理解.更具体 - 只有在运行时它被证明是一个指向子类型的指针时,我希望对父类型的指针进行赋值.解决方案?

谢谢.

Alo*_*ave 6

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

std::bad_cast如果无法安全地下载指针或引用,则返回NULL或抛出异常(对于References).

你会在频繁运行的方法中使用动态强制转换吗?它有很大的开销吗? dynamic_cast确实使用一些额外的东西RTTI(Run Time Type Information)来确定演员表的有效性.所以肯定有一个开销.典型地,一个指针到typeinfotype将被添加到所述virtual table.我通常说,因为虚拟机制本身是编译器实现依赖的细节(可能因不同的编译器而异).

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

究竟是指针返回的是什么dynamic_cast.指向同一地址的指针?指向不同实例的指针?

通过我们分析向上转换而不是分析向下转换,更容易理解.给定一个继承自的类型和另一种类型,该类型将包含一个类型的子对象.当指向对象的指针被上传到指针时,操作的结果将是内部子对象的地址.执行还原该操作,并返回指向包含作为参数传递的地址中的子对象的对象的指针(执行相同操作,但它将应用可能的偏移而不实际检查运行时类型).dynamic_castbasederivedbasederivedbasederivedbasebase deriveddynamic_castderivedbasestatic_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;
}
Run Code Online (Sandbox Code Playgroud)

该程序将打印true,false.请注意,void*如果要比较它们,则必须显式地转换其中一个指针,否则编译器将执行隐式向上转换指向下的指针.

  • 它并不总是返回相同的地址.在某些情况下,必须修改指针的地址.但它总是指向原始对象的某个部分. (2认同)
  • 在一般情况下,第二部分不是*正确*.在这种特殊情况下,两个指针是相同的,但不一定是这种情况.例如,考虑一下,有一个非空类`C`,而`B`继承自`C`和'A`:`struct B:C,A`.现在`A`子对象没有与`B`对象对齐,而指向'A`和`B`的指针将不一样.这甚至不考虑虚拟继承...保证两个指针都引用相同的*real*对象(一个是另一个的子对象) (2认同)