“this”指针如何在 C++ 的继承中工作?

how does the 'this' pointer work in inheritance in c++?

提问人:mayank mahajan 提问时间:5/18/2022 更新时间:5/19/2022 访问量:608

问:

问题:

  1. 在下面的代码中,“this”指针指向基类和派生类中的不同内容,即使它在技术上包含相同的地址。为什么。
  2. 当“this”指针与继承一起使用时会发生什么。 (任何帮助将不胜感激,谢谢。
#include <iostream>
using namespace std;

// this pointer and inheritance.
class base {
public:
  int x;
  base() {
    x = 10;
  }
  void func() {
    cout<< this->x << endl; // 10
    cout<< this << endl;
  }
};
class derived : public base {
public:
  int x;
  derived() {
    x = 20;
  }
  void func() {
    cout<< this->x << endl; // 20
    cout<< this << endl;
    base::func();
  }
};

int main () {
  derived d;
  d.func();

  cout<< "execution complete.\n";
  return 0;
}
output:
20
0x61ff18
10
0x61ff18
execution complete.
C++ 继承 重写 vtable

评论

1赞 πάντα ῥεῖ 5/18/2022
相关,如果不是重复的:stackoverflow.com/questions/44410120/......
0赞 Jarod42 5/18/2022
derived这里有 2 个。x
0赞 pptaszni 5/18/2022
1.它指向同一事物,你的实例;然后你会看到 10 和 20,因为 your 在派生类中被遮蔽了;2.没什么特别的derived d;mainint x;
0赞 user253751 5/18/2022
struct x {int y;}; x z;&z 和 &z.y 是相同的地址,但指向不同的东西
0赞 Drew Dormann 5/18/2022
对于Stack Overflow来说,“'this'指针是如何工作的?”和“使用'this'指针时会发生什么?”这两个问题可能太宽泛了。似乎你的理解是不完整的,你试图要求我们解释C++的各个方面,直到你的理解感觉足够完整。我认为需要的是一个更具体的问题。

答:

2赞 eerorika 5/18/2022 #1
  1. 在下面的代码中,“this”指针指向基类和派生类中的不同内容,即使它在技术上包含相同的地址。为什么。

类包含子对象。它们可以是基子对象,也可以是非静态数据成员。第一个子对象可以共享封装完整对象的内存地址:

|derived  |  < complete object
|base|x   |  < sub objects of derived
|x   |       < sub objects of base sub object

^
|
same address    
  1. 当“this”指针与继承一起使用时会发生什么。

如果调用类的非静态成员函数,则指向该函数中的实例参数。this

如果调用派生对象的基的非虚拟非静态成员函数,将指向该函数中的基子对象。this

如果使用非限定查找调用类的虚拟非静态成员函数,它将调用该函数的最派生重写,并在该函数中指向派生该函数的对象。this

2赞 Drew Dormann 5/18/2022 #2

您的类包含两个整数。它们的名称如下:derived

this->base::x

this->derived::x

您似乎发现,您可以简单地键入以引用其中一个整数。this->x

编译器将根据上下文决定您引用的内容。在类中,你一定是说.在派生类中,假定您的意思是并且需要显式编写以告诉编译器您引用的是 中定义的。xbasethis->base::xthis->derived::xthis->base::xint x;base

“this”指针指向基类和派生类中的不同内容

事实并非如此。

this没有指向 和 中的不同事物。这是一样的.basederivedthis

更改的含义,因为您的类有两个变量,它们都命名为 .this->xx

0赞 user12002570 5/18/2022 #3

程序中的类具有一个名为的成员函数,该函数隐藏了继承的同名成员函数。同样,该类也是一个名为 的数据成员,该成员隐藏了继承的具有相同名称的数据成员。derivedfuncbasederivedxbase

现在,当你写道:

d.func(); //this calls the derived class member function `func` implicitly passing the address of `d` to the implicit `this` parameter

在上面的调用中,您调用了类的成员函数,同时将 的地址隐式传递给隐式参数。内部的类型是 。derivedfuncdthisthisfuncderivedderived*

现在,在表达式的成员函数内部使用派生类的数据成员(而不是继承的成员),因为如上所述,它从基隐藏了继承的成员。因此,我们得到输出funcderivedthis->xxx20

接下来,只需打印 .cout<< this << endl;this

接下来,遇到调用表达式。还要注意,这相当于写 .这样做的效果是,它调用继承的成员函数,该函数由于派生类具有同名函数而隐藏。请注意,在此调用中,相同的地址被传递给基类的隐式参数。这次的区别在于,inside 的成员函数是 类型。base::func()base::func()this->base::func()functhisfuncthisbasefuncbase*

现在,在 的成员函数中,in 表达式引用基类的数据成员,因此打印值 。因此,我们得到输出funcbasexthis->xx1010

最后,我们有 内部 的成员函数 ,它只是打印 .cout<< this << endl;basefuncthis