C++隐式指针转换

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 *'

3
你可以让 B 继承A,否则指针转换就没有什么实际意义。 - Kerrek SB
这只是一个人为的例子,但在我正在处理的生产代码中,A和B可以通过转换构造函数(通过引用)进行转换。 - Short
1
但它们是完全不同的类型。把一个看作另一个是没有意义的。 - Kerrek SB
“Cast”是你在源代码中编写的内容,它告诉编译器要进行“转换”。因为它出现在源代码中,所以不存在“隐式转换”。然而,“隐式转换”确实存在。 - Pete Becker
你可以通过引用来实现。引用可以隐式转换。 - Yousf
3个回答

4
不可能的,因为一个 B 不是一个 A。你需要使用继承,将 B 作为 A 的子类(这样一个 B 就成为了一个 A),或者使用组合并引用适当的子对象。

1
不,无法使该行不出现错误,因为在您的示例中B*A*不能隐式转换。
如果它们按正确顺序在同一继承层次结构中,或者如果Avoid的typedef,则它们将是可转换的。现在这些类型是不相关的,语言规则禁止在这种不相关的指针类型之间进行隐式转换。

1
指针不能被强制转换。即使定义了operator=函数,它也只能在相应的对象上工作,而不能在它们的指针上工作。
就像这样:
A *c;
*c = b;  //or 
c->operator=(b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接