dynamic_cast <b * =“”>(&amp; a)发出警告</b>

时间:2013-08-03 06:59:15

标签: c++

我有这段代码

#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作为指针?

3 个答案:

答案 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;
}

请尝试。