3

我有以下测试程序(展示了我真正想要完成的事情)。

有谁知道如果没有 reinterpret_cast<> 是否可以实现以下操作?

struct B;

struct A {
  A() { }
  A( const B &b) { }
  A( const B *b) { }
  A( B *b) { }

  A* operator=(const B *b) { }
  A* operator=(B *b) { }
};

struct B {
  B() { }
  B( const A &a) { }
  B( const B * b) { }
  B( B *b) { }

  B* operator=(const A *a) { }
  B* operator=(A *a) { }
};

int main(int argc, char *argv[])
{
  A *a = new A();
  B *b = new B();

  A *c = b;

  return 0;
}

我尝试尽我所能做每一个转换运算符,但我似乎无法得到

  A *c = b;

不抱怨

error C2440: 'initializing' : cannot convert from 'B *' to 'A *'
4

3 回答 3

4

不,这是不可能的,因为 aB不是A. 您要么需要使用继承来创建B一个子类A(以便 aB是一个A),要么使用组合然后引用适当的子对象。

于 2012-09-06T20:57:05.940 回答
1

不,不可能使该行不是错误,因为在您的示例中B*并且A*不能隐式转换。

如果它们以正确的顺序位于相同的继承层次结构中,或者如果Avoid. 现在这些类型是不相关的,并且语言规则拒绝在这些不相关的指针类型之间进行隐式转换。

于 2012-09-06T21:21:03.920 回答
1

不能投射指针。即使定义了 operator= 函数。这仅适用于相应的对象,而不适用于它们的指针。

像那样:

A *c;
*c = b;  //or 
c->operator=(b);
于 2012-09-06T21:43:52.570 回答