Вот пример кода. Обратите внимание, что 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;
}
Вот вывод, который я вижу при компиляции с GCC 4.2:
A
B
Я бы посчитал это правильным поведением, но затрудняюсь объяснить, как оно работает должным образом, учитывая, что std::tr1::function
s были связаны с &A::print
в обоих случаях. Может кто-нибудь, пожалуйста, просветите меня?
РЕДАКТИРОВАТЬ: Спасибо за ответы. Я знаком с наследованием и полиморфными типами. Что меня интересует, так это то, что &A::print
означает ? Является ли это смещением в vtable, и этот vtable изменяется в зависимости от упомянутого объекта (в данном случае a
или b
?) С точки зрения более простого понимания, как этот код работает правильно? *