メモ: 継承による関数名の隠蔽

派生クラスで基底クラスと同じ名前の関数を定義すると、たとえ引数の型が違っていても派生クラスで定義した関数が呼び出される。

#include <iostream>
#include "../../std_lib_facilities.h"

struct B{
    void f(char c) { std::cout << "B::f " << c << std::endl; }
};

struct D : B{
    void f(double d)  { std::cout << "D::f " << d << std::endl; } 
};

int main()
{
    B b;
    b.f('x');   // => B::f x
    D d;
    d.f('x');   // => D::f 120  引数がcharなのにD::fを呼ぶ。
    d.f(10.0);  // => D::f 10

    keep_window_open();
}

基底クラスの関数が呼び出されるんじゃないんですね。ビビりました。

この章と、同じ本の12章「仮想関数を用いた多態性」を理解すれば、一つ前の記事に書いた疑問から、抜け出せるかも。