2016-04-02 11 views
1

C++ - 私はクラスを持っている場合は、純粋仮想関数のパラメータ

class Base { 
public: 
    virtual void func() = 0; 
}; 

言う二つの他のクラス

class DerivedA1 : public Base { 
public: 
    virtual bool func(string command); 
}; 

class DerivedB1 : public Base { 
public: 
    virtual void func(); 
} 

class DerivedA2 : public DerivedA1 { 
public: 
    bool func(string command);  //This one implements it differently 
};         //its base class. 

のための基本です許さ以上ですか?私はパラメータなしでfunc()を宣言しましたが、私はそれをパラメータとともに使用しています。これは、それは学校の割り当ての一部ですので、私は私が投稿することはできません私のコードで似たような状況を持っている、と

error: no matching function for call to Base::fucn(std::string&) 
note: candidate is: virtual bool Base::move(); 
note: candidate expects 0 arguments, provided 1 

のようなエラーを取得私はFUNC()その異なるで異なる使用したいのです派生クラス。この問題を解決するにはどうすればよいですか?

+0

いいえ、許可されていません。基本クラスの 'virtual'関数のオーバーライドは、まったく同じシグネチャでなければなりません。 –

+0

派生クラスがメソッドの引数を変更することを可能にする* contravariance *というコンセプトがありますが、ここでは該当しません。 *デフォルトの引数*を使用することができます:http://en.cppreference.com/w/cpp/language/default_arguments – mike

+0

このパラメータには別のクラスを作成できます。仮想void func(MyBaseParemeterClass *)= 0; – QuentinUK

答えて

2

DerivedA1::func(string)は、隠蔽Base::func()である。許可されていますが、振る舞いを無効にすることはありませんBase::func。打ち鳴らすはこれについて警告が表示されます、それはほとんど常にエラー

class DerivedA1 : public Base { 
public: 
    virtual bool func(string command); 
}; 

ですので、これは問題です:

class DerivedB1 : public Base { 
public: 
    virtual void func(); 
} 

これはDerivedA1::func(string)をオーバーライドしています。 DervivedA1インターフェイス上にのみ存在する仮想関数またはそれから派生したもの。存在しませんBase

class DerivedA2 : public DerivedA1 { 
public: 
    bool func(string command);  //This one implements it differently 
};     
関連する問題