スーパークラスから継承できるようにするには、スーパークラスにデフォルトのコンストラクターを含める必要がありますか?すべての派生クラスコンストラクターがスーパークラスコンストラクターの1つを明示的に呼び出して、適切なパラメーターを提供していると仮定します-そのようなコードは機能しますか?
5 に答える
スーパークラスから継承できるようにするには、スーパークラスにデフォルトのコンストラクターを含める必要がありますか?
いいえ。
基本クラスにデフォルトのコンストラクターがない場合は、派生クラスのコンストラクターのメンバー初期化リストから明示的に引数を指定して基本クラスのコンストラクターを呼び出す必要があります。
例、
class base
{
public:
base(std::string const & s, int n);
};
class derived : public base
{
anotherClass obj;
public:
derived() : base("string", 10), obj(100)
{ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ member-initialization list
}
};
の構文に注意してくださいbase("string", 10)
。基本クラスのコンストラクターを呼び出し、"string"
最初の引数と10
2番目の引数として渡します。
また、タイプが:obj(100)
のメンバー変数を初期化することに注意してください。コンストラクターを呼び出し、そのコンストラクターを引数として取ります。anotherClass
obj(10)
anotherClass
int
その場合
- デフォルトのコンストラクターは明示的に呼び出されません
- すべてのサブクラスは、構築時にパラメーターを使用してユーザー定義のスーパークラスコンストラクターを呼び出します
デフォルトのコンストラクターを作成することは必須ではありません。
子クラスのすべてのコンストラクターが親の明示的なコンストラクターを使用する場合、親がデフォルトのコンストラクターを持つ必要はありません。
デフォルトのコンストラクターがないクラスがある場合、インスタンス化時に全員が明示的なコンストラクターを使用する必要がありますよね?これは同じ概念です。すべての子がデフォルトのコンストラクターが呼び出されないことを確認した場合、それを実装する必要はありません。
いいえ、1つの可能な例外を除いて。通常、基本クラスコンストラクターは、その派生クラス(存在する場合)によって提供される引数を使用して、そのすぐ上の派生クラスによって呼び出されます。すべての直接派生クラスが基本クラスを明示的に初期化する場合、デフォルトのコンストラクターは必要ありません。
考えられる例外の1つは、基本クラスから仮想的に継承する場合です。その場合、基本クラスを初期化するのは直接派生クラスではなく、最も派生したクラスです。また、クラス階層がどのように編成されているかによっては、最も派生したクラスにベースについて知られたくない場合があります。ほとんどの派生クラスは、直接継承するクラスについてのみ知っていれば十分です。(もちろん、これは理想的であり、常にそうであるとは限りません。)幸いなことに、これが発生するたびに、ベースはデータのない(したがってデフォルトのコンストラクターを持つ)抽象クラスです。しかし、それは覚えておくべきことです。
いいえ、デフォルトのコンストラクターは必要ありません。以下は、プライベートDefaultコンストラクターの有無にかかわらず、コンパイルおよび実行されます。
class A {
public:
A(int i) {
m = i;
}
private:
A() { } // This line can be commented out. Included only to make point
int m;
};
class B : A {
public:
B(int i)
: A(i)
{
}
};
int main() {
B b(10);
}