【问题标题】:this values in derived classes in C++C++ 派生类中的 this 值
【发布时间】:2014-05-23 10:43:59
【问题描述】:

我有一个关于 C++ 派生类中“this”点的问题。

class A
{
    int a;
public:
    void funca() { cout << this << endl; }
};
class B
{
    int b;
public:
    void funcb() { cout << this << endl; }
};
class Derived : public A, public B {};

int main() {
    Derived d;
    d.funca();
    d.funcb();  // prints 4bytes more than the above.
}

在这种情况下,如何在派生类中解释基类中的“this”? 这是派生类的this还是基类的this? 从输出中,我认为这指向了使用它的类对象。我说的对吗?

【问题讨论】:

    标签: c++ inheritance this derived


    【解决方案1】:

    如何在派生类中解释基类中的“this”?

    我想问题应该是基类如何驻留在派生类中

    当一个类被另一个类继承时,编译器会将基类的成员放在派生类中。 this 总是指实际的对象,你是对的。 d.funcb(); 提前打印 2 个字节,因为 B 的成员在 Derived 中的 A 的 4 个字节之后开始。这 4 个字节由A::a 成员变量占用。但是布局和内存模型并不能保证,并且取决于编译器。 Derived 的一种可能的内存布局可能是

    Members of A (4 byte in this case for a)
    Members of B (4 byte in this case for b)
    Members of Derived (if any)
    

    所以派生类没有基类“this”,只有一个this,指的是实际的对象。派生类获得其中基类成员的副本。

    【讨论】:

    • 当您涉及多重继承和虚拟继承时,这会变得更加复杂,使得 this 指针在不同类型中具有不同的值
    【解决方案2】:

    类 Derived 包含两个子对象 A 和 B。这些子对象具有非静态成员函数。这些函数的第一个隐含参数是指向相应对象的指针。 因此,在您的示例中,当调用函数 funca 时,它会获取指向 Derived 类中的子对象 A 的指针。与调用函数 funcb 的方式相同,它获取指向 Derived 类中的子对象 B 的指针。

    在每个类定义中,this 表示已定义类的对象。在类 A 的类定义中,这表示类 A 的对象。在类 B 的类定义中,这表示类 B 的对象。在类内部派生子对象 A 和 B 具有不同的位置,即不同的地址。因此,您示例中的输出会有所不同。

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-06-10
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多