需要向下倾斜澄清

时间:2016-03-25 19:47:57

标签: c++ downcast

我不太明白如何贬低。显然我不能这样做......

class myType
{
};

class otherType : public myType
{
};

int main()
{
    myType* obj = new myType;

    otherType* castObj = dynamic_cast<otherType*>(obj);

    delete obj;
}

我错过了什么?

2 个答案:

答案 0 :(得分:0)

我认为需要做一些澄清。

当B类派生自A类时,以下成立:

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

如果您持有指向A的指针,您可以通过尝试dynamic_cast到B来检查它是否是B的A部分。如果该转换成功,那是因为您实际指向B&#39 ; s界面。如果演员阵容没有成功,那么你所指向的类似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

答案 1 :(得分:0)

我喜欢向女友解释这个:

什么是汽车意味着肯定有车轮

轮次的东西不一定会成为汽车

假设我们有课程:

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类型的处理程序匹配的异常。