c++ - 'this' 与继承的奇怪行为

标签 c++ oop inheritance

我无法理解以下示例中 this 的值:

struct A {
  int i;

  void bar() {
    cout << this << endl;
  }
};

struct B : public A {
  virtual void foo() = 0;
};

struct C : public B {
  void foo() {
    printf("hello world!\n");
  }
};

int main (int argc, const char* argv[]) {
  C* c = new C; 
  cout << c << endl;
  c->bar();
  return 0;
}

两次我打印指向控制台的指针,我得到不同的值。我希望它是相同的,因为它们两次都引用同一个实例?!

如果我删除A中的虚函数或int i,它就会消失。为什么?

最佳答案

但它指的是不同的事物。

void bar() {
    cout << this << endl;
  }

这里this有一个类型A*。它指向对象的A部分。

out << c << endl;

这里c是一个C*并指向对象的C部分。

如果A对象与C对象完全对齐,则指针是相同的。如果它们不一样(比如当 C 包含其他成员(指向 vtable 的隐藏指针),因此“A”部分从较大对象的开头偏移),则指针不一定相同。

关于c++ - 'this' 与继承的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827414/

相关文章:

c++ - 类和成员变量

java - 在OOP中,写子类的时候是不是要改掉原来的main方法代码?什么代替?

Javascript Proxy set() 继承对象的局部属性

c++ - 歧义语句 C++-AMP : (extent) is ambiguous

c++ - 当调试器无法将您带到那里时用于调试的工具?

c++ - 可以删除(或默认)非特殊 C++ 成员函数吗?

c++ - 使用头文件和源文件的模板化类

c++ - 面向对象设计 - 将 C 应用程序转换为 C++

c++ - 调用父虚函数

c++ - 如何在 C++ 中向下转换以从父实例调用子函数?