派生クラスによる関数の隠蔽

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

派生クラスで隠蔽される関数の例を見てみます。

スポンサーリンク

#include <iostream>
 
class parent {
public:
    int calc(int a, int b) { return (a + b); }
    float calc(float c, float d) { return (c * d); }    // オーバーロード
};
 
class child : public parent {
public:
    int calc(int a, int b) { return (a - b); }    // オーバーライド
};
 
int main() {
    child test;
 
    std::cout << test.calc(10, 5) << "\n";    // 5を返す
    std::cout << test.calc(5.6, 3) << "\n";    // 正しくない結果(2)を返す
}

仮想関数・virtualキーワードで説明しましたが、派生クラスをインスタンス化した場合、メンバは「派生クラス→基底クラス」と検索されます。

上記プログラムの場合、親クラスparentでメンバ関数calc()をオーバーロードしていますが、子クラスchildで、calc()をオーバーライドしています。
したがって、childをインスタンス化してメンバ関数calc()を呼び出すと、子クラスchildのcalc()のみが呼び出されて、親クラスのcalc()は排除(隠蔽)されます。

よって、実行結果は、float型による計算は行われずに、5.6がint型(整数)の5に変換されて、5-2が行われました。
実行結果。

5
2
スポンサーリンク
 
スポンサーリンク