dynamic_cast不保证有效的完整对象?

时间:2012-04-19 04:50:52

标签: c++ casting dynamic-cast

我正在阅读this page,并说

  

dynamic_cast只能用于指针和对象的引用。其目的是确保类型转换的结果是所请求类的有效完整对象。

但是当我这样做时,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向下转发需要在基类中至少有一个虚拟成员。

1 个答案:

答案 0 :(得分:2)

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);
}