我不太明白如何贬低。显然我不能这样做......
class myType
{
};
class otherType : public myType
{
};
int main()
{
myType* obj = new myType;
otherType* castObj = dynamic_cast<otherType*>(obj);
delete obj;
}
我错过了什么?
答案 0 :(得分:0)
我认为需要做一些澄清。
当B类派生自A类时,以下成立:
如果您持有指向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类型的处理程序匹配的异常。