C ++は、初期化リストの外部で親コンストラクターを明示的に呼び出します

グレゴリー・ニスベット

したがって、親クラスのコンストラクターを呼び出す通常の方法は、初期化リストにあります。

例えば

#include <cstdio>

struct Parent {
  explicit Parent(int a) {
    printf("Parent -- int\n");
  }
};

struct Child : public Parent {
  explicit Child(int a) : Parent(1) {
    printf("Child -- int\n");
  }
};

int main(int argc, char **argv) {
  Child c = Child(10);
};

Parent -- intその後、印刷しChild -- intます。

(ある程度)それが良い考えかどうかを無視して、初期化リストの外で、コンストラクターの本体(構築されているオブジェクト上)で親コンストラクターを明示的に呼び出すことができるかどうか疑問に思っています。

mnistic

いいえ、希望どおりではないため、オブジェクトの親部分を構築します。

このような状況に対処する一般的な方法は、子コンストラクターから呼び出すことができる「init」または「construct」メソッドを用意することです。

struct Parent {
    explicit Parent(int a) {
        Construct(a);
    }
protected:
    void Construct(int a) { printf("Parent -- int\n"); }
    Parent() {}
};

struct Child : public Parent {
    explicit Child(int a) {
        Parent::Construct(a);
        printf("Child -- int\n");
    }
};

int main(int argc, char **argv) {
    Child c = Child(10);
};

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++およびJavaでのコンストラクター呼び出しに明示的な型パラメーターが必要なのはなぜですか?

分類Dev

C#での明示的なコンストラクター呼び出し

分類Dev

親コンストラクターの呼び出しC ++

分類Dev

C ++ 11配列の初期化はコピーコンストラクターを呼び出さない

分類Dev

C ++の多重継承と明示的なコンストラクター呼び出し

分類Dev

警告変数を初期化するためのコンストラクターからのC26495関数の呼び出し、なぜですか?

分類Dev

c ++テンプレートは、特定のタイプのクラスに対して特定のコンストラクターを呼び出します

分類Dev

コンストラクタからデストラクタを明示的に呼び出すことは、C ++では悪い習慣ですか?

分類Dev

C ++が親のデフォルトコンストラクターを暗黙的に呼び出すのはなぜですか?

分類Dev

C ++標準に従って、コンストラクタとデストラクタを明示的に呼び出すことは安全ですか?

分類Dev

C#の別のクラスのコンストラクターからコンストラクターを呼び出すことはできますか?

分類Dev

C ++は、コピーコンストラクターではなくデフォルトコンストラクターを呼び出します

分類Dev

C ++ 11:派生クラスを破棄するために、基本クラスのデストラクタを明示的に呼び出すことはできますか?

分類Dev

C ++初期化子リスト機能:メンバーを初期化せずに関数を呼び出しますか?

分類Dev

c ++はテンプレートコンストラクターを呼び出してインスタンス化します

分類Dev

C ++での直接コンストラクター呼び出し

分類Dev

C ++初期化リストの基本クラス初期化の前に関数を呼び出す

分類Dev

同じクラスc#のコンストラクターでコンストラクターを呼び出し、同じコンストラクターのベースコンストラクターを呼び出す

分類Dev

C ++ベクトルemplace_backはコピーコンストラクターを呼び出します

分類Dev

C ++ 11:「= {}」を使用したクラス内初期化は、明示的なコンストラクターでは機能しません

分類Dev

C ++デストラクタ-継承コンテキストでの明示的な呼び出し

分類Dev

C#オブジェクト初期化子-コンストラクター呼び出しの括弧を含めますか?

分類Dev

クラスインスタンスを初期化するときに、C ++がクラスメンバーのコンストラクターを暗黙的に呼び出す

分類Dev

明示的な呼び出しによるC#コンストラクターのあいまいさ-エラーCS0012

分類Dev

C ++はオブジェクトを参照によって関数に渡し、そのコンストラクターが呼び出されます

分類Dev

c ++ std変換はコピーコンストラクターを複数回呼び出します

分類Dev

C ++は、コピーコンストラクターでリストの割り当てを初期化し、コピーコンストラクターでクラッシュします

分類Dev

main()c ++でコンストラクターを呼び出すにはどうすればよいですか?

分類Dev

C ++派生クラスは、初期化の前に基本クラスのメソッドを呼び出します

Related 関連記事

  1. 1

    C ++およびJavaでのコンストラクター呼び出しに明示的な型パラメーターが必要なのはなぜですか?

  2. 2

    C#での明示的なコンストラクター呼び出し

  3. 3

    親コンストラクターの呼び出しC ++

  4. 4

    C ++ 11配列の初期化はコピーコンストラクターを呼び出さない

  5. 5

    C ++の多重継承と明示的なコンストラクター呼び出し

  6. 6

    警告変数を初期化するためのコンストラクターからのC26495関数の呼び出し、なぜですか?

  7. 7

    c ++テンプレートは、特定のタイプのクラスに対して特定のコンストラクターを呼び出します

  8. 8

    コンストラクタからデストラクタを明示的に呼び出すことは、C ++では悪い習慣ですか?

  9. 9

    C ++が親のデフォルトコンストラクターを暗黙的に呼び出すのはなぜですか?

  10. 10

    C ++標準に従って、コンストラクタとデストラクタを明示的に呼び出すことは安全ですか?

  11. 11

    C#の別のクラスのコンストラクターからコンストラクターを呼び出すことはできますか?

  12. 12

    C ++は、コピーコンストラクターではなくデフォルトコンストラクターを呼び出します

  13. 13

    C ++ 11:派生クラスを破棄するために、基本クラスのデストラクタを明示的に呼び出すことはできますか?

  14. 14

    C ++初期化子リスト機能:メンバーを初期化せずに関数を呼び出しますか?

  15. 15

    c ++はテンプレートコンストラクターを呼び出してインスタンス化します

  16. 16

    C ++での直接コンストラクター呼び出し

  17. 17

    C ++初期化リストの基本クラス初期化の前に関数を呼び出す

  18. 18

    同じクラスc#のコンストラクターでコンストラクターを呼び出し、同じコンストラクターのベースコンストラクターを呼び出す

  19. 19

    C ++ベクトルemplace_backはコピーコンストラクターを呼び出します

  20. 20

    C ++ 11:「= {}」を使用したクラス内初期化は、明示的なコンストラクターでは機能しません

  21. 21

    C ++デストラクタ-継承コンテキストでの明示的な呼び出し

  22. 22

    C#オブジェクト初期化子-コンストラクター呼び出しの括弧を含めますか?

  23. 23

    クラスインスタンスを初期化するときに、C ++がクラスメンバーのコンストラクターを暗黙的に呼び出す

  24. 24

    明示的な呼び出しによるC#コンストラクターのあいまいさ-エラーCS0012

  25. 25

    C ++はオブジェクトを参照によって関数に渡し、そのコンストラクターが呼び出されます

  26. 26

    c ++ std変換はコピーコンストラクターを複数回呼び出します

  27. 27

    C ++は、コピーコンストラクターでリストの割り当てを初期化し、コピーコンストラクターでクラッシュします

  28. 28

    main()c ++でコンストラクターを呼び出すにはどうすればよいですか?

  29. 29

    C ++派生クラスは、初期化の前に基本クラスのメソッドを呼び出します

ホットタグ

アーカイブ