7

警告を下回っています。私のコードの一部は次のとおりです。

class Base {
public:
    virtual void process(int x) {;};
    virtual void process(int a,float b) {;};
protected:
    int pd;
    float pb;
};

class derived: public Base{
public:
    void process(int a,float b);
}

void derived::process(int a,float b){
    pd=a;
    pb=b;
    ....
}

警告を下回っています:

 Warning: overloaded virtual function "Base::process" is only partially overridden in class "derived"

いずれにせよ、プロセスを仮想関数として作成したので、この警告が表示されないことを期待しています...この背後にある理由は何ですか??

4

5 に答える 5

4

クラスの仮想メソッドをオーバーライドすると、オーバーライドされていないそのメソッドのオーバーロードは、そのクラスに対して非表示になり、使用できなくなります。process(int)したがって、あなたの例では、オーバーライドされたオブジェクトが非表示になっているため、オブジェクトを呼び出そうとするderivedと失敗process(int, float)します。

于 2014-01-30T17:15:56.553 に答える
1

の 2 つのオーバーロードのうちの 1 つだけをオーバーライドしましたprocess。のみを取るオーバーロードがありませんint

class Base {
public:
    virtual void process(int x) {;}; // You do *not* override this in derived
    virtual void process(int a,float b) {;}; // You do override this
// ...
};

必要に応じて、次のことができます。

  1. intのオーバーロードもオーバーライドするだけderivedです。また

  2. オーバーロードを非仮想にしint、仮想オーバーロードを呼び出させますint, float

2 つの補足事項: (a) ほとんどのコンパイラはそれを受け入れますが;、関数本体の後の a は構文的に間違っています。(b) 一般に、保護されたメンバー変数は、パブリック変数とほぼ同じくらい嫌われています。保護されたゲッター/セッターを使用し、変数をプライベートにする必要があります。

于 2014-01-30T17:13:22.210 に答える
1

のメソッドと同じ名前のメソッドを宣言するとBase、それらのメソッドは非表示になります。

1 つのメソッドをオーバーライドする場合です。

そう

derived d;
d.process(42); // won't compile

それを解決するには:追加using Base::process

class derived: public Base {
public:
    using Base::process;
    void process(int a, float b);
};

前のメソッドは lint 警告を黙らせないため、それを解決する別の方法は、各メソッドをオーバーライドすることですprocess

class derived: public Base {
public:
    void process(x) { Base::process(x); }
    void process(int a, float b);
};
于 2014-01-30T17:21:47.457 に答える
0

C++ オーバーロードの解決

簡単に言えば、オーバーロードされた関数を部分的にオーバーライドすることは、名前を解決しようとするときに奇妙になる可能性があります。

また、デザインの観点から。パターンは一般的に奇妙です。同じ名前を保証するのに十分なほど同じであると判断した機能があります。一般に、同じことを行うことは暗黙の合意です。子クラスの関数の動作を変更する場合、派生の一部だけを変更すると奇妙になります。本質的に、読みやすい ( ~= をほぼ等しいものとして使用)

//暗黙のステートメント

1) Base::process(int) ~= Base::process(int,float)

2) 派生::プロセス(int) ~= 派生::プロセス(int,float)

//明示的なステートメント

3) ベース::プロセス(int) == 派生::プロセス(int)

4) Base::process(int,float) != 派生::process(int,float)

基本的に、3 と 4 は矛盾しているため、2 が真である可能性はありません。

于 2014-01-30T17:22:16.993 に答える