c++ - dynamic_cast 不保证一个有效的、完整的对象?

标签 c++ casting dynamic-cast

我正在阅读 this page它说

dynamic_cast can be used only with pointers and references to objects. Its purpose is to ensure that the result of the type conversion is a valid complete object of the requested class.

但是当我这样做时 dynamic_cast 没有给出一个有效的对象:

struct A{};
struct B:A{};
void main(){
    A a;
    B b;
    B* bPtr = (B*) 0x0000001;
    A* aPtr = dynamic_cast<A*>(bPtr);
    //Now aPtr is the memory address 0x00000001
}

因为 bPtr 不包含一个有效的 A 对象,我希望 dynamic_cast 会失败这个转换,这样 aPtr 就会得到 NULL。但这不会发生吗?哪个错误,编译器(g++ 4.5.7)还是上面提到的网页?还是我遗漏了一些关于 dynamic_cast 实际应该做什么的信息?

编辑:答案摘要

  1. 在upcast 中,dynamic_cast 什么都不做。没有任何形式的保证。
  2. 在向下转换中,dynamic_cast 不检查坏指针。它假定源指针为 0 或指向有效的源对象。 (如果给 dynamic_cast 操作一个错误的指针,它可能会在向下转换期间发生段错误)
  3. 通过 dynamic_cast 向下转换需要基类中至少有一个虚拟成员。

最佳答案

dynamic_cast<>保证提供有效的对象,前提是它被正确使用。

使用此转换的第一个要求 是具有多态基类(至少 1 个 virtual 函数)。在您的示例中,AB不是多态的,会导致编译错误。

第二个要求dynamic_cast<>应该用于向下转换,在您的情况下,您将它用于向上转换(这种情况很常见)。

假设它们是多态的,那么第三个​​要求是在指向适当对象的指针/引用上使用此转换。
bPtr = (B*)0x0000001不保证引用 B 的对象(主要是 UB) .

这是正确的例子:

struct A{ virtual ~A() {} };
struct B : A {};
void main(){
  A* pA = new B;
  B* pB = dynamic_cast<B*>(pA);
}

关于c++ - dynamic_cast 不保证一个有效的、完整的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221814/

相关文章:

c++ - 使用 opencv C++ 进行图像(颜色?)分割

c++ STL按int和string的 vector 排序

c# - 将 DataTable 列转换为类型化 IEnumerable[]

c++ - 如何使用dynamic_cast

c++ - 重载运算符

c++ - dynamic_cast 失败

c++ - 使用来自/clr :pure projects 的混合 DLL

c++ - 将图像从屏幕坐标转换为世界坐标

java - 扩展 File 类时出现 ClassCastException 问题

c++ - 类型转换 C++