6

基本クラスがある場合:

class Base{
  ...
};

および派生クラス

class Derived : public Base{
  ...
}

この派生クラスは常に基本クラスのデフォルトコンストラクターを呼び出しますか?つまり、パラメーターを受け取らないコンストラクターですか?たとえば、基本クラスのコンストラクターを定義すると、次のようになります。

Base(int newValue);

しかし、私はデフォルトのコンストラクター(パラメーターなしのコンストラクター)を定義していません:

Base();

(これは単なる宣言であり、定義ではないことを認識しています)パラメーターを受け取らないデフォルトのコンストラクターを定義するまで、エラーが発生します。これは、基本クラスのデフォルトコンストラクターが、派生クラスによって呼び出されるコンストラクターであるためですか?

4

4 に答える 4

10

はい、デフォルトでは、デフォルトのコンストラクターが呼び出されます。デフォルト以外のコンストラクターを明示的に呼び出すことで、これを回避できます。

class Derived : public Base{
    Derived() : Base(5) {}
};

これにより、パラメーターを受け取る基本コンストラクターが呼び出され、基本クラスでデフォルトコンストラクターを宣言する必要がなくなります。

于 2012-11-19T00:36:40.087 に答える
1

デフォルトのコンストラクターが呼び出される理由は、オブジェクトを作成し、その時点で引数を渡していない場合に備えて(プログラムの後半でそれらを初期化することをお勧めします)。これが最も一般的なケースであるため、デフォルトのコンストラクターを呼び出す必要があります。

于 2013-05-22T07:09:47.007 に答える
1

デフォルトでは、コンパイラは3つのデフォルトを提供します。

  1. デフォルト(パラメーターなし)Ctor

  2. Ctorをコピーする

  3. 代入演算子

パラメータ化されたCtorまたはコピーCtorを自分で提供する場合、コンパイラはデフォルトCtorを提供しないため、デフォルトCtorを明示的に記述する必要があります。

Derivedクラスオブジェクトを作成すると、デフォルトでBaseのデフォルトのCtorが検索されます。指定していない場合、コンパイラはエラーをスローします。ただし、DerivedクラスCtorを作成して、指定したBaseCtorを呼び出すことができます。

class Base {
public:
Base(int x){}
};

class Derived {
public:
Derived():Base(5){}             //this will call Parameterized Base Ctor
Derived(int x):Base(x){}        //this will call Parameterized Base Ctor
}
于 2013-05-22T07:40:50.930 に答える
0

はい、デフォルトでは、デフォルトのコンストラクターが呼び出されます。ただし、基本クラスにパラメーター化されたコンストラクターがある場合は、2つの方法でデフォルト以外のコンストラクターを呼び出すことができます。

option 1: by explicitly calling a non-default constructor:

class Derived : public Base{
Derived() : Base(5) {}
};

オプション2:

in base class constructor set the parameter default value to 0, so it will 
 act as default as well as paramterized constructor both

for example:

class base
{ public:
base(int m_a =0){} 
};

 class Derived
 { public:
 Derived(){}
};

上記のアプローチは、パラメーター化されたコンストラクター呼び出しとデフォルトのコンストラクター呼び出しの両方で正常に機能します。

于 2017-10-06T06:10:58.470 に答える