2

ここに問題があります—私にはこのような2つのクラスがあります:

class A
{
  //some fields and methods 
   void niceMethod();
};

class B : public A
{
   void niceMethod();
};

class C : public A
{
   void niceMethod();
};

と機能

void myFunc(A** arrayOfABC);

// Double *は、引数を変更しようとしていることに注意してください。

そして私はしたい:

(*arrayOfABC)[i].niceMethod();

私の関数では、BまたはCの配列を関数に渡すときにさまざまなことを実行します。

しかし、私はそれを次のように呼ぼうとします

 B* bees = NULL;
    myFunc(&bees);

「B**の引数タイプはA**タイプのパラメータと互換性がありません」があります。

BまたはCをAとしてf(A)のような関数に渡すことができることは知っていますが、ポインターの何が問題になっていますか?

4

2 に答える 2

3

コンパイラは正しいです、それは確かに互換性がありません。このことを考慮:

B* bees = new B[2];
myFunc(&bees); // Imagine that it's allowed

myFuncあなたの中でこれをします:

void myFunc(A** arrayOfABC) {
    // This is OK:
    arrayOfABC[0] = new C();
}

Cextendsを拡張するため、これは許可する必要がありますA。ただし、から戻ったときにmyFuncbeesが含まれているためC、これは適切ではありません。

これを修正するには、の配列を作成し、へのA*ポインタを入力しますB

niceMethodPS仮想化することを忘れないでください。そうしないと、期待どおりに機能しません。

于 2012-05-31T15:25:27.683 に答える
2

に変換できますが、に変換することはできB*ませA*ん。B**A**

果物Aであり、BリンゴでA*あるとすると、果物(任意の果物)をB*指すことができる小さな矢印であり、リンゴ(そしてリンゴのみ)を指すことができる小さな矢印です。リンゴの矢を取り、果物の矢としてラベルを付け直して、果物の矢を期待している人に渡すことができます。リンゴは一種の果物なので、それは確かに果物を指しています。これまでのところ、ここで驚くことはありません。

これA**で、果物(任意の果物)をB**指すことができる小さな矢印を指すことができる小さな矢印であり、リンゴ(およびリンゴのみ)を指すことができる小さな矢印を指すことができる小さな矢印です。後者を取り、前者を期待している人に渡したらどうなるでしょうか。その人は、果物(どんな果物でも!)を指すことができる矢印を指すことができる矢印に沿って進み、その2番目の矢印を取り、それを回転させてバナナを指すようにすることができます。

今、二重のリンゴの矢を持っていた不幸なリンゴの男は、最初の矢印に沿って進み、次にリンゴを指すはずの2番目の矢印に沿って進み、そこでバナナを見つけます。彼の惨めな人生。あなたが私に尋ねれば、それはかなり不幸な状況です。この時点から物事がバナナになっても驚かないでください!

于 2012-05-31T15:43:56.373 に答える