在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
答案 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 |
+-------+-----+---------------------------+