呼び出しシーケンス問題のC ++ 11継承された構造

I最近C ++の新機能11非常に奇妙な呼び出しシーケンスを発見した構造を継承のビットを、試して手がフリー:

で、親クラスBase パラメータとパラメータのコンストラクタがあるかどうかをベース::ベースを使用してサブクラスの場合は、すべての親クラスのコンストラクタ、何の問題を継承することができます。

しかし、その後のサブクラスであれば、それぞれ書き込まコンストラクタはないパラメータ及び引数を取らない場合があった場合
、次のコード:

#include <iostream>
using namespace std;
class Base {
public:
    int value1=0;
    int value2=0;
    Base() {
        value1 = 1;
    }
    Base(int value) : Base() {
        value2 = 2;
    }
};
class Next : Base {
public:
    using Base::Base;
    int value3 = 0;
    int value4 = 0;
    Next() {
        value3 = 3;
    }
    Next(int value) {
        value4 = 4;
    }
    void show() {
        cout << this->value1 << endl;
        cout << this->value2 << endl;
        cout << this->value3 << endl;
        cout << this->value4 << endl;
    }
};
int main(int argc, char** argv)

{
    Next N;
    Next N2(3);
    cout << "N:" << endl;
    N.show();
    cout << "N2(3):" << endl;
    N2.show();
    cout << "finish"  << endl;
}

結果:

N:
1
0
3
0
N2(3):
1
0
0
4
finish

私によると、元の想像
オブジェクトがN作成され、(1)最初のコールベースの引数なしのコンストラクタ引数なしのコンストラクタは、(2)次のポストを呼び出します。
オブジェクトが作成されるN2場合、(1)最初のコールベースベースリアベースの引数なしコンストラクタコール(2)引数コンストラクタ、(3)をコンストラクタパラメータは次にているコール

しかし、実際の状況N2けどは基本引数のコンストラクタを呼び出す必要はありませんでした
そのため、新しいC ++ 11継承建設ステートメントを使用している場合は、このポイントに注意を払う必要があります。

リリース9件のオリジナルの記事 ウォンの賞賛1 ビュー156

おすすめ

転載: blog.csdn.net/qq_37782336/article/details/104595105