1

私は C++ での継承が初めてなので、この主題について学ぶためにいくつかの実験を試みることにしました。

以下のコードは、私が作成しているクラスの階層を示しています。

クラス.h

class base
{
protected:
    int _a;
    int _b;
    int _c;;
    base(int b, int c);
};

class sub_one : public virtual base
{
public:
    sub_one(int a, int b) : base(a, b)
    {
        // do some other things here
    }

    // other members
};


class sub_two : public virtual base
{
protected:
    int _d;
public:
    sub_two(int a, int b, int c = 0) : base(a, b) 
    {
        // do something
    }

    // other members
};


class sub_three : public sub_one, public sub_two
{
private:
    bool flag;
public:
    sub_three(int a, int b, int c = 0) : base(a, b) 
    {
        // do something    
    }
};

classes.c

base::base(int a, int b)
{
    // ...
}

コンパイラは私にメッセージを表示します:

sub_one::sub_one() の呼び出しに一致する関数がありません

sub_one::sub_one() の呼び出しに一致する関数がありません

sub_two::sub_two() の呼び出しに一致する関数がありません

sub_two::sub_two() の呼び出しに一致する関数がありません

何が悪いのかわかりません。

4

2 に答える 2

2
sub_three(int a, int b, int c = 0) : base(a, b) 
{
    // do something    
}

次と同等です。

sub_three(int a, int b, int c = 0) : base(a, b), sub_one(), sub_two() 
{
    // do something    
}

sub_oneとにはそのようなコンストラクタがないためsub_two、コンパイラはエラーを報告します。デフォルトのコンストラクターを追加してsub_onesub_twoエラーを削除できます。

于 2016-11-15T05:06:47.230 に答える
1

sub_threeコンストラクターは を初期化し、存在しないandbaseのデフォルト コンストラクターを呼び出します。必要になる場合があります。sub_onesub_two

class sub_three : public sub_one, public sub_two
{
private:
    bool flag;
public:
    sub_three(int a, int b, int c = 0)
       : base(a, b), sub_one(a,b), sub_two(a,b,c), flag(false)
    {
        // do something    
    }
};
于 2016-11-15T05:07:17.527 に答える