c ++隐式指针转换

时间:2012-09-06 20:53:19

标签: c++ pointers casting implicit

我有以下测试程序(演示了我真正想要完成的工作)。

如果没有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 *'

3 个答案:

答案 0 :(得分:4)

不,这是不可能的,因为B不是A。您需要使用继承来使B成为A的子类(以便BA),或者使用组合然后引用相应的子对象。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

指针无法投射。即使有定义了operator = function。这仅适用于各自的对象,而不是指针。

像那样:

A *c;
*c = b;  //or 
c->operator=(b);