4

谁能告诉我为什么这不能编译:

struct A { };
struct B : public A { };

int main()
{
  B b;
  A* a = &b;
  B* &b1 = static_cast<B*&>(a);
  return 0;
}

现在,如果您将静态转换替换为:

B* b1 = static_cast<B*>(a);

然后它会编译。

编辑:很明显,编译器将A*andB*视为独立类型,否则这将起作用。问题更多是关于为什么这是可取的?

4

4 回答 4

7

B派生自A,但B*不派生自A*。指向 aB的指针不是指向 a 的指针A,它只能转换为一个。但是类型仍然不同(并且转换可以而且经常会改变指针的值)。AB*&只能引用 a B*,不能引用任何其他指针类型。

于 2013-01-17T16:03:41.740 回答
3

非常量左值引用 (B*&) 不能绑定到不相关的类型 (A*)。

于 2013-01-17T15:47:38.833 回答
0

您正在尝试将 anA*转换为B*. 这是错误的方法,不是很有用。您可能希望将派生的指针存储在指向基址的指针中,这很有用,甚至不需要强制转换。

我想 adynamic_cast可能在这里工作,但如果我没记错的话,结果是实现定义的。

于 2013-01-17T15:55:06.863 回答
0

处理引用是编译器为你做的事情,不需要强制转换为引用。

如果我们将代码重构为:

B b;
A* a = &b;
B* b_ptr = static_cast<B*>(a);
B*& p1 = b_ptr;

它会编译。

于 2013-01-17T16:04:59.010 回答