Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要下推澄清吗_C++_Downcast - Fatal编程技术网

C++ 需要下推澄清吗

C++ 需要下推澄清吗,c++,downcast,C++,Downcast,我不太明白如何沮丧。显然我不能这样做 class myType { }; class otherType : public myType { }; int main() { myType* obj = new myType; otherType* castObj = dynamic_cast<otherType*>(obj); delete obj; } 类myType { }; 类otherType:公共myType { }; int main()

我不太明白如何沮丧。显然我不能这样做

class myType
{
};

class otherType : public myType
{
};

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

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

    delete obj;
}
类myType
{
};
类otherType:公共myType
{
};
int main()
{
myType*obj=新的myType;
otherType*castObj=动态_-cast(obj);
删除obj;
}

我遗漏了什么?

我认为需要澄清一下

当B类源于A类时,以下情况适用:

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

因此:

结构A{ 虚拟~A(); }; // 基层 结构B:A{};//a B是a,但a不一定是B A*pa=新的A; //爸爸指着一个A B*pb=动态_铸造(pa); //pb现在将为空,因为此强制转换将失败。 //记住,a B*是a*a,但a*不一定是a*B 删除pa; //再试一次。。。 pa=新的B; //pa指向A B的A部分,所以 pb=动态荷载(pa); //pb现在指向同一个对象,但可以访问B接口上的所有方法 删除pb; //清理
我想这样向我的女朋友解释:

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

轮子的东西不一定就是汽车

假设我们有课:

class A

B类
当然具有
A类
的所有特征,可能还有更多,但我们可以通过简单地“移除”它所携带的所有其他东西,将其安全地转换为
A类
另一方面,这是不正确的:我们不能确定
A类
将具有与您试图将其投射到的类相同的特征,在这种情况下
B类
。这就是为什么您必须使用
动态强制转换
,通知编译器您已经意识到随之而来的风险

如果强制转换成功,则动态\u强制转换将返回类型为new\u type的值。如果强制转换失败,并且new_类型是指针类型,则返回该类型的空指针。如果强制转换失败,并且新的\u类型是引用类型,它将抛出一个与std::bad\u cast类型的处理程序匹配的异常


你试着从“较小”类型转换为“较宽”类型,这并不是贬低,我可以提供更好的类比:作为一只狗,肯定会使它成为一种动物。作为一种动物,它不一定就是一只狗。我有数百万只,但你明白了。现在我在自言自语
class A
Class B: public A