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です。継承を使用して( aがになるように)Bのサブクラスを作成するか、構成を使用してから適切なサブオブジェクトを参照する必要があります。ABA

于 2012-09-06T20:57:05.940 に答える
1

ポインタはキャストできません。operator=関数が定義されている場合でも。これは、それぞれのオブジェクトでのみ機能し、ポインタでは機能しません。

そのように:

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

B*いいえ、あなたの例ではandA*は暗黙的に変換できないため、その行をエラーにしないことはできません。

それらが正しい順序で同じ継承階層にある場合、またはAの typedef である場合は、そうなりますvoid。現在、型は無関係であり、言語規則は、そのような無関係なポインター型間の暗黙的な変換を拒否しています。

于 2012-09-06T21:21:03.920 に答える