c – 虚拟成员函数和std :: tr1 :: function:这是如何工作的?
发布时间:2020-12-16 09:29:57 所属栏目:百科 来源:网络整理
导读:这是一段代码示例.请注意,B是A的子类,并且都提供唯一的打印例程.另请注意,两个绑定调用都是 A :: print,但在后一种情况下,传递了对B的引用. #include iostream#include tr1/functionalstruct A{ virtual void print() { std::cerr "A" std::endl; }};struct
|
这是一段代码示例.请注意,B是A的子类,并且都提供唯一的打印例程.另请注意,两个绑定调用都是& 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 :: functions在两种情况下都绑定到& A :: print.有人可以赐教吗? 编辑:谢谢你的答案.我熟悉继承和多态类型.我感兴趣的是& A :: print是什么意思?它是否为vtable的偏移量,并且vtable基于引用的对象进行更改(在本例中为a或b?)从更加坚定的角度来看,此代码如何正确运行? 解决方法
这与使用普通成员函数指针的方式相同.以下产生相同的输出:
int main ()
{
A a;
B b;
typedef void (A::*fp)();
fp p = &A::print;
(a.*p)(); // prints A
(b.*p)(); // prints B
}
如果boost / tr1 / std :: function做了任何不同的事情,那将是令人惊讶的,因为他们可能会将这些指针存储在引擎盖下的成员函数中.哦,当然没有链接到the Fast Delegates article就没有提到这些指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
