为什么不同的`this`在使用多重继承时解决

时间:2014-04-10 12:55:06

标签: c++ memory-management c++11 std multiple-inheritance

在C ++中,它是使用std::enable_shared_from_this和继承的小样本代码。此代码中的p,调用成员函数fb和fa。 p是同一个对象,但称为fa和fb采用不同的this地址。

为什么要使用不同的地址?

代码:

#include <memory>
#include <iostream>

template<class T> using S = std::enable_shared_from_this<T>;

struct A: S<A>    { auto fa() const -> void { std::cerr << this << "\n";} };
struct B: S<B>, A { auto fb() const -> void { std::cerr << this << "\n";} };

auto main() -> int
{
    auto p = std::make_shared<B>();

    p -> fa();
    p -> fb();

    std::cerr << p << "\n";
}

结果:(经过测试的编译器是Linux Mint 16 KDE上的clang ++ - 3.2,g ++ - 4.8和em ++ - 1.12,以及作为在线编译平台的wandbox中的clang ++ - 3.4。)

0x8376a8
0x837698
0x837698

wandbox:http://melpon.org/wandbox/permlink/rmcCrR0rqLd7tKfV

1 个答案:

答案 0 :(得分:5)

这与std::enable_shared_from_this无关;它是多重继承的一般场景。在类X的成员函数内,this的类型为X*,即它指向完整对象的X子对象。因此,在A::fa()对象上调用B时,this会引用A的{​​{1}}子对象。根据编译器选择的内存布局,可以从对象的初始地址偏移。

换句话说,对象B包含基类对象B和基类对象A。由于您首先列出了S<B>,因此编译器选择在S<B>的布局中首先布局S<B>,在B布局后布局A。所以内存布局看起来像这样:

+-------+-----+---------------------------+
| S<B>  | A   | B's non-inherited members |
+-------+-----+---------------------------+