需要下行广播澄清

Need downcasting clarification

本文关键字:广播      更新时间:2023-10-16

我不太明白如何向下转换。显然我不能这样做。。。

class myType
{
};
class otherType : public myType
{
};
int main()
{
    myType* obj = new myType;
    otherType* castObj = dynamic_cast<otherType*>(obj);
    delete obj;
}

我错过了什么?

我认为需要一些澄清。

当B类是从A类派生而来时,以下情况成立:

  • 一个B就是一个a
  • A不一定是B

如果你持有一个指向a的指针,你可以通过尝试dynamic_cast到B来检查它是否是B的a部分。如果转换成功,那是因为你实际上指向了B的a接口。如果演员阵容没有成功,那么你所指的类似A的东西实际上并不是B.

因此:

struct A {
    virtual ~A();
};        // a base class
struct B : A {};    // a B is an A but an A is not necessarily a B
A* pa = new A;
// pa is pointing to an A
B* pb = dynamic_cast<B*>(pa);
// pb will now be NULL because this cast will have failed.
// Remember, a B *is an* A, but an A *is not necessarily a* B
delete pa;
// try again...
pa = new B;
// pa points to the A-part of a B, so
pb = dynamic_cast<B*>(pa);
// pb now points to the same object, but has access to all the methods on the B interface
delete pb;
// clean up

这就是我喜欢向我的女朋友解释的方式:

一辆汽车意味着它肯定有车轮

车轮的东西并不一定使其成为汽车

假设我们有课程:

class A

Class B: public A

Class B肯定具有Class A的所有特征,甚至可能更多,但我们总是可以通过简单地"移除"它携带的所有额外东西来安全地将它转换(投射)为Class A反之亦然:我们不能确定Class A将具有与您试图将其投射到的类(在本例中为Class B)相同的特征。这就是为什么您必须使用dynamic cast来通知编译器您已经意识到了随之而来的风险。

如果强制转换成功,dynamic_cast将返回类型为new_type的值。如果强制转换失败,并且new_type是指针类型,则返回该类型的空指针。如果强制转换失败,并且new_type是引用类型,则会抛出一个与std::bad_cast类型的处理程序匹配的异常。