これがサンプルコードです。B
はのサブクラスでA
あり、両方とも固有のprint
ルーチンを提供することに注意してください。main
また、両方のbind
呼び出しがへの呼び出しであることに注意して&A::print
ください。ただし、後者の場合、への参照B
が渡されます。
#include <iostream>
#include <tr1/functional>
struct A
{
virtual void print()
{
std::cerr << "A" << std::endl;
}
};
struct B : public A
{
virtual void print()
{
std::cerr << "B" << std::endl;
}
};
int main (int argc, char * const argv[])
{
typedef std::tr1::function<void ()> proc_t;
A a;
B b;
proc_t a_print = std::tr1::bind(&A::print, std::tr1::ref(a));
proc_t b_print = std::tr1::bind(&A::print, std::tr1::ref(b));
a_print();
b_print();
return 0;
}
GCC4.2でコンパイルした出力は次のとおりです。
A
B
私はこの正しい振る舞いを検討しますが、両方の場合std::tr1::function
にsがバインドされていることを考えると、それがどのように正しく機能しているかを説明するのに迷っています。&A::print
誰かが私を教えてくれませんか?
編集:答えてくれてありがとう。私は継承とポリモーフィック型に精通しています。私が興味を持っているのはどういう&A::print
意味ですか?a
それはvtableへのオフセットであり、そのvtableは参照されるオブジェクト(この場合、または?)に基づいて変化します。より基本b
的な観点から、このコードはどのように正しく動作しますか?