1

親クラスのバージョンの仮想およびオーバーライドされた関数の std::function オブジェクトを作成したいです。次の例を参照してください。

#include <iostream>
#include <functional>

class Parent
{
    public:

        virtual void func1()
        {
            std::cout << "Parent::func1\n";
        }

        virtual void func2()
        {
            std::cout << "Parent::func2\n";
        }
};

class Child : public Parent
{
    public:

        // overrides Parent::func1
        virtual void func1()
        {
            std::cout << "Child::func1, ";
            Parent::func1();
        }

        // overrides Parent::func2
        virtual void func2()
        {
            std::cout << "Child::func2, ";
            std::function< void() > parent_func2 = std::bind( &Parent::func2, this );
            parent_func2();
        }
};

int main()
{
    Child child;

    child.func1(); // output: Child::func1, Parent::func1

    child.func2(); // output: Child::func2, Child::func2, ...

    return 0;
}

への呼び出しchild.func1()は期待どおりに動作しますが、への呼び出しchild.func2()は無限再帰になり、バインドするつもりだったのではなく、parent_func2()呼び出しているように見えます。Child::func2()Parent::func2()

どうすればparent_func2()本当に電話できるのParent::func2でしょうか?

4

1 に答える 1