【问题标题】:Why different `this` address in using multiple inheritance为什么在使用多重继承时使用不同的`this`地址
【发布时间】:2014-05-24 04:47:04
【问题描述】:

在 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

魔杖盒:http://melpon.org/wandbox/permlink/rmcCrR0rqLd7tKfV

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 2018-11-06
    • 2019-04-26
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2011-06-21
    相关资源
    最近更新 更多