public inheritanceのエラー


下記のコードを考えたとき、hogeを継承したhoge2からhogeのpublic member
functionを呼び出せるはずですが、hoge2でhoge_function()を定義して、hoge_function(bool)を呼び出そうとするとvisual
studioではC2660、clangではtoo many argumentsのエラーが出てしまいます。

なぜこのような挙動をするのでしょうか？

参考ですが、hoge2のhoge_function(bool)を削除すれば、エラーがなくなります。

追記：  
コメントを参考に以下のように質問のコードを修正しました。

[code]

    #include<iostream>
    #include<memory>
    class hoge
    {
    public:
    
        virtual void hoge_function()
        {
            std::cout << "hoge" << std::endl;
        }
    
        //virtual void hoge_function(bool hoge = true)
        virtual void hoge_function(bool hoge)
        {
            std::cout << "hogehoge" << std::endl;
        }
    };
    
    class hoge2 : public hoge
    {
    public:
        //virtual void hoge_function()
        virtual void hoge_function(bool hoge)
        {
            std::cout << "hoge2" << std::endl;
        }
    };
    
    int main()
    {
        std::shared_ptr<hoge2> hogehoge = std::make_shared<hoge2>();
    
        // this line returns an error
        hogehoge->hoge_function(true);
    
        return 0;
    }
    
[/code]




`using hoge::hoge_function;`というのを`hoge2`の側に追加すると期待の動作にすることができるようです。

[code]

    class hoge2 : public hoge
    {
    public:
        using hoge::hoge_function;
        virtual void hoge_function()
        {
            std::cout << "hoge2" << std::endl;
        }
    };
    
[/code]

C++のシンボル名解決とoverloading解決の手順は、

  1. 直近のscopeでシンボル名を解決する
  2. 解決されたscopeの範囲でoverloadingを解決する(継承関係は遡らない)

と言う形になるそうです。

従ってご所望の形でoverloadingを解決したければ、`hoge_function`が定義されたscope内に他の全てのoverloadも取り込んでおけば良い、と言うことらしいです。

以上本家の[Overriding a Base's Overloaded Function in
C++](https://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-
function-in-c)とduplicate元とされている記事を参考にしました。("c++ overriding overloaded
function"での検索結果をたどってます。)




`using hoge::hoge_function;`というのを`hoge2`の側に追加すると期待の動作にすることができるようです。

[code]

    class hoge2 : public hoge
    {
    public:
        using hoge::hoge_function;
        virtual void hoge_function()
        {
            std::cout << "hoge2" << std::endl;
        }
    };
    
[/code]

C++のシンボル名解決とoverloading解決の手順は、

  1. 直近のscopeでシンボル名を解決する
  2. 解決されたscopeの範囲でoverloadingを解決する(継承関係は遡らない)

と言う形になるそうです。

従ってご所望の形でoverloadingを解決したければ、`hoge_function`が定義されたscope内に他の全てのoverloadも取り込んでおけば良い、と言うことらしいです。

以上本家の[Overriding a Base's Overloaded Function in
C++](https://stackoverflow.com/questions/888235/overriding-a-bases-overloaded-
function-in-c)とduplicate元とされている記事を参考にしました。("c++ overriding overloaded
function"での検索結果をたどってます。)

