0

私はC++での継承が初めてで、このテーマについていくつかの実験を試みることにしました。複数の継承で一致する関数がありません

classes.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_twoする呼に対するsub_one()

sub_oneする:: sub_oneを(呼に該当する機能)

一致する関数:: sub_two()

sub_twoする呼に該当する機能:: sub_two()

何が間違っているのか分かりません。

+0

が必要な場合があります 'sub_three'コンストラクタは' base'を初期化しますが、他の2を初期化することを忘れその基本クラス。 'sub_one'と' sub_two'のどちらもデフォルトのコンストラクタを持っていないので、それらを 'sub_three'のコンストラクタ初期化子リストに明示的にリストする必要があります。 –

答えて

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_onesub_twoではありませんので、コンパイラはエラーを報告します。 sub_onesub_twoにデフォルトコンストラクタを追加して、エラーを取り除くことができます。

1

sub_threeコンストラクタはbaseを初期化し、sub_oneと存在しないsub_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  
    } 
}; 
関連する問題