我有这段代码
#include <iostream>
class A
{
virtual void func() {}
};
class B : A
{
void func() {}
};
int main()
{
A a;
B* b;
b = dynamic_cast<B *> (&a);
if (b == NULL)
{
std::cout << "Bad cast" << std::endl;
}
}
代码的行为与我期望的一样(转换失败)但是我得到了这个编译器警告,我不明白
nullptr.cc:18:28:警告:'A a'到'B类*'的dynamic_cast永远不会成功[默认启用]
如果我使用“new”分配A对象,则没有警告。为什么dynamic_cast无法识别 &amp; a作为指针?
答案 0 :(得分:3)
编译器 将&a
识别为指向A
的指针,否则将无法编译
但请查看您的代码:&a
始终是指向A
的指针,永远不会指向B
!类型为A
的对象(非指针,您定义的a
之类的实际对象)不可能是A
类型的对象。当我把它写下来时,它甚至听起来很傻。
在您的示例中,&a
总是定义(定义{{1}})是指向A a
而不是A
的指针,因此编译器会让您知道做傻事。顺便说一句 - 如果你用优化编译它,实际的可执行文件甚至不会尝试强制转换,甚至不会评估你的B
语句。它可能会将您的代码转换为:
if
提前删除所有知道的答案。
答案 1 :(得分:1)
所有编译器都告诉你,指针永远不会指向B的实例,因此b
始终为null。
编译器将它识别为指针就好了 - 它只是试图通过标记可疑行为来帮助您。这应该是警告,而不是错误。
答案 2 :(得分:0)
a是一个具体对象,而具体对象从不指向其子类。 dynamic_cast仅适用于指针和引用。
A *ptr;
B *b, b1;
ptr = &b1;
b = dynamic_cast<B*>(ptr);
if(b == nullptr){
cout << "Bad Cast" << endl;
}
请尝试。