2

以下は、多重継承で直面するひし形の問題です。

class Base {
 public:
  Base() {
    cout << "Empty Base constructor " << endl; 
  }
  Base(const string & strVar) { 
    m_strVar = strVar; 
    cout << m_strVar << endl;
  }
  virtual ~Base() {
    cout << "Empty Base destructor " << endl;
  }
  virtual const string & strVar() const { 
   return m_strVar; 
  }

  string m_strVar;
};

class Derived1: public virtual Base {
 public:
  Derived1() {
    cout << "Empty Derived1 constructor " << endl; 
  }
  Derived1(const string & strVar) : Base(strVar) {
    cout << " Derived1 one arg constructor" << endl;
  }
  ~Derived1() {
    cout << "Empty Derived1 destructor " << endl;
  }
};

class Derived2: public virtual Base {
 public:
  Derived2() {
    cout << "Empty Derived2 constructor " << endl; 
  }
  Derived2(const string & strVar) : Base(strVar) {
    cout << "Derived2 one arg constructor" << endl;
  }
  ~Derived2() {
    cout << "Empty Derived2 destructor " << endl;
  }
};

class Derived: public Derived1, public Derived2 {
 public:
  Derived(const string & strVar) : Derived1(strVar), Derived2(strVar) {
    cout << "Derived Constructor " << endl; 
  }
  ~Derived() {
    cout << "Empty Derived destructor " << endl;
  }
};

int main() {
  Derived derObj ("Print this if you can ! "); 
}

私が得る出力は

  1. 空のベース コンストラクター
  2. Derived2 1 つの引数コンストラクター
  3. Derived1 1 つの引数コンストラクター
  4. 派生コンストラクター
  5. 空の派生デストラクタ
  6. 空の Derived2 デストラクタ
  7. 空の Derived1 デストラクタ
  8. 空のベース デストラクタ

私のderObjパラメータ、つまり「可能であればこれを印刷してください」が印刷されず、出力が似ていないのはなぜだろうか

  1. 空のベース コンストラクター
  2. Derived2 1 つの引数コンストラクター
  3. できればこれを印刷してください!
  4. Derived1 1 つの引数コンストラクター
  5. 派生コンストラクター
  6. 空の派生デストラクタ
  7. 空の Derived2 デストラクタ
  8. 空の Derived1 デストラクタ
  9. 空のベース デストラクタ
4

1 に答える 1

6

これは、仮想継承に関係しています。

クラスが仮想的に継承される場合、そのコンストラクター: here を呼び出すのは、階層内で最も派生したクラスDerivedの責任です。

Baseはデフォルトで構築可能であり、何も正確に指定していないため、Derivedのデフォルト コンストラクタを呼び出しますBase

文字列を印刷したい場合は、次を使用します。

Derived(const string & strVar) : Base(strVar), Derived1(strVar), Derived2(strVar)
{
  std::cout << "Derived Constructor\n"; 
}

デフォルトのコンストラクターを削除して、コンパイラーが問題を診断できるようにすることもできますが、すべてのコンパイラーが非常に役立つメッセージを表示するわけではありません。

于 2012-02-16T09:29:51.957 に答える