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

Usa*_*Ito 3 c++ memory-management std multiple-inheritance c++11

在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";
}
Run Code Online (Sandbox Code Playgroud)

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

0x8376a8
0x837698
0x837698
Run Code Online (Sandbox Code Playgroud)

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

Rei*_*ica 5

这与此无关std::enable_shared_from_this; 这是多重继承的一般情况.在类的成员函数内X,thisis 的类型X*,即它指向X完整对象的子对象.所以当调用A::fa()一个B对象时,this指的是A子对象B.根据编译器选择的内存布局,可以从对象的初始地址偏移.

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

+-------+-----+---------------------------+
| S<B>  | A   | B's non-inherited members |
+-------+-----+---------------------------+
Run Code Online (Sandbox Code Playgroud)