1
4

3 回答 3

4

编译器确实将其识别&a为指向 的指针A,否则将无法编译

但是看看你的代码:&a总是一个指向 的指针A,永远不会指向B!类型的对象A(非指针,像您定义的实际对象a)不可能不是类型的对象A。当我把它写下来时,它甚至听起来很傻。

在您的示例中&a,根据定义(定义A a)将始终是指向A而不是的指针B,因此编译器让您知道您正在做一些愚蠢的事情。顺便说一句 - 如果你用优化编译它,实际的可执行文件甚至不会尝试强制转换,甚至不会评估你的if语句。它可能会将您的代码转换为以下内容:

A a;
cout << "Bad cast"<<endl;

删除它事先知道的所有答案。

于 2013-08-03T07:18:56.610 回答
2

编译器告诉你的只是指针永远不会指向 B 的实例,因此b始终为空。

编译器将它识别为一个指针就好了——它只是试图通过标记有问题的行为来帮助你。这应该是警告,而不是错误。

于 2013-08-03T07:10:21.190 回答
0

a 是一个具体对象,具体对象从不指向它的子类。dynamic_cast 仅适用于指针和引用。

A *ptr;
B *b, b1;

ptr = &b1;

b = dynamic_cast<B*>(ptr);

if(b == nullptr){
  cout << "Bad Cast" << endl;
}

请试一试。

于 2020-07-30T11:36:11.387 回答