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就没有提到这些指针. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |