5

FooとBazから継承するクラスWaldoを考えてみましょう。

class Waldo : public Foo, public Baz {
  ...
};

Waldoの新しいインスタンスを作成するとき:

   Waldo *w = new Waldo;

FooおよびBazコンストラクターは呼び出されますか?それらがデフォルトで呼び出されない場合、クラス宣言またはWaldoコンストラクターの宣言/定義でそれらを強制的に呼び出す簡単な方法はありますか?

(コンストラクターチェーンを実行しようとしているようですが、C ++はそれを実行していないと言われています。わかりません。)

私がやろうとしているのは、さまざまなクラス宣言に「注釈を付ける」ことです。注釈により、(とりわけ)注釈付きクラスのインスタンスが注釈クラスによって維持されるリストにリンクされます。これにより、たとえば、Baz-natureを持つすべてのオブジェクトのリストをたどり、特定の操作を適用することができます。Baz-natureを持つオブジェクトのリストにインスタンスを追加したことを覚えているかどうかを心配する必要はありません。これは、コンストラクターはそれを自動的に行いました。

4

2 に答える 2

7

はい、彼らは呼ばれています。左から右へ。

于 2012-04-16T14:48:48.550 に答える
1

クラスのすべてのメンバーのコンストラクターは、クラスで宣言されている順序で呼び出されます。

派生クラスの既定のコンストラクターは、既定で基底クラスのコンストラクターを呼び出します。引数が必要な場合は、明示的に呼び出す必要があります。それ以外の場合はエラーになります...

 class Employee {
 private:
     //
 public:
    Employee();
    //...
 };



 class Manager: public Employee {
 private:
     short level;
 public:
     Manager(): Employee(), level() {}    // This is the default constructor, it calls Employee(). 
     // The definition is equivalent to default constructor of Manager..
     //...
  };
于 2012-04-16T15:39:16.430 に答える