我有以下测试程序(演示了我真正想要完成的工作)。
如果没有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 *'
答案 0 :(得分:4)
不,这是不可能的,因为B
不是A
。您需要使用继承来使B
成为A
的子类(以便B
为A
),或者使用组合然后引用相应的子对象。
答案 1 :(得分:1)
不,不可能使该行不是错误,因为在您的示例中B*
和A*
不可隐式转换。
如果它们以正确的顺序位于相同的继承层次结构中,或者A
是void
的typedef,则它们将是。现在类型是不相关的,语言规则拒绝这些不相关的指针类型之间的隐式转换。
答案 2 :(得分:1)
指针无法投射。即使有定义了operator = function。这仅适用于各自的对象,而不是指针。
像那样:A *c;
*c = b; //or
c->operator=(b);