識別子の同じ純粋仮想関数で引数を取るものと取らないものがあった時2種類ともオーバーライドしなければならないか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
てろっぷ
記事: 9
登録日時: 9年前

識別子の同じ純粋仮想関数で引数を取るものと取らないものがあった時2種類ともオーバーライドしなければならないか?

#1

投稿記事 by てろっぷ » 9年前

以前クラスに関する質問をした時はお世話になりました。
今回もクラスに関する質問をさせていただきます。

コード:

virtual int func() = 0;
virtual int func(int p) = 0;
上のように識別子の同じ二つの純粋仮想関数を定義し、ある派生クラスでは引数を取らない方を、別の派生クラスでは引数を取る方を使いたいと考えているのですが、この場合2種類ともオーバーライドしなければなりませんよね?

言語:C++
開発環境:Microsoft Visual Studio 2013

[hr]
オフトピック
皆さんテロップはこんな感じに水平線で区切って挿入しているのでしょうか?
それともランクアップすると入れられるようになる仕様とか?(素朴な疑問)
[tab=30]プログラミングって難しいですね…

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: 識別子の同じ純粋仮想関数で引数を取るものと取らないものがあった時2種類ともオーバーライドしなければならないか?

#2

投稿記事 by YuO » 9年前

当然,両方ともオーバーライドをしないといけません。

オーバーロードされた関数である以上,最終的には似たような動作を行うのが普通です。
オフトピック
典型例は,引数の一部が省略されていて,省略部分にはデフォルト値が設定されるような場合。
オーバーロードされた関数が全く異なる動作をするのであれば,そもそも別名をつけないと使う側が混乱します。
なので,全引数入りの純粋仮想関数を用意しておいて,残りの関数はデフォルトの設定としてその全引数入りの関数を呼ぶような作りにします。
こうすることで,通常は一つの仮想関数のオーバーライドで実装が済み,効率等の問題で特定の引数の組み合わせの場合だけ別のコードで実行したい,というようなことを処理できます。

コード:

class foo {
protected:
    virtual int funcImpl (int p1, const std::string & p2) = 0;
public:
    virtual int func () { return funcImpl(0, ""); }
    virtual int func (int p) { return funcImpl(p, "");}
    virtual int func (const std::string & p) { return funcImpl(0, p); }
};

てろっぷ
記事: 9
登録日時: 9年前

Re: 識別子の同じ純粋仮想関数で引数を取るものと取らないものがあった時2種類ともオーバーライドしなければならないか?

#3

投稿記事 by てろっぷ » 9年前

返信遅れました。
成る程...やはりオーバーライドしなければならないと...
お、ご教示頂いたテクニックは面白いですね。
ただ無理にこう組むくらいなら普通に引数を取る関数を宣言すれば良いと思ったので、
つまり自分のプログラムでも初めからそうすればよかったってことですね...
YuOさん、回答ありがとうございました。勉強になりましたm(__)m
[tab=30]プログラミングって難しいですね…

閉鎖

“C言語何でも質問掲示板” へ戻る