加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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就没有提到这些指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读