-1

重複の可能性:
C++ では、仮想基底クラスとは何ですか?

このコードでは、DR のオブジェクトが作成されるときに、文字列 "Hello World" が 4 回出力されるはずですが、代わりに 3 回だけ出力されます。なぜそうなのですか?mid1とmid2が実質的に継承されているためだと思います。 クラスを仮想的に継承するとどうなるか、さらに重要なことにそれが有用な場合とその理由を説明してもらえますか?

#include <iostream>

struct BS
{
  BS()
  {
    std::cout << "Hello World" << std::endl;
  }
  unsigned int color;
};

struct mid1 : virtual public BS { };
struct mid2 : virtual public BS { };
struct mid3 : public BS { };
struct mid4 : public BS { };

struct DR : public mid1, public mid2, 
            public mid3, public mid4 { };

int main(int argc, char** argv) 
{ 
  DR d;
  return 0; 
}
4

1 に答える 1

7

簡単な例を見てみましょう。

class base {};

class mid1 : public base {};
class mid2 : public base {};

class derived1 : public mid1, public mid2;

class mid1a : virtual public base {};
class mid2a : virtual public base {};

class derived2 : public mid1a, public mid2a {};

これらのオブジェクト図を描くと、次のようになります。

ここに画像の説明を入力

中間クラスが仮想継承を使用する場合、派生クラスには、各中間クラスからの個別のインスタンスではなく、基底クラスの単一のインスタンスのみが含まれます。

あなたの場合、基本クラスのインスタンスが 4 つではなく 3 つになります。

于 2013-01-04T20:31:05.107 に答える