问问题
1969 次
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 回答