为什么"*this"解析为子类

  • 本文关键字:quot 子类 this c++ oop
  • 更新时间 :
  • 英文 :

// Example program
#include <iostream>
#include <string>
class A;
class B;
void h(A &a) { std::cout << "a"; }
void h(B &b) { std::cout << "b"; }
class A {
public:
virtual void call() { h(*this); }
};
class B: public A {
public:
void call() override { h(*this); }
};
int main()
{
B b = B{};
A &test = b;

h(test); // prints a
test.call(); // prints b
}

我在代码上乱了一会儿,注意到*this似乎总是知道它是哪个子类,而通常我们";丢失信息";当我们将子类初始化为超类对象时。

h(*this)调用h(B &b)而不是h(A &a)的幕后究竟发生了什么?main中的两个调用有什么不同之处,一个打印a,另一个打印b?

h(test); // prints a

由于test的类型是A &,所以它就是被调用的重载。这里没有什么好说的了。结束。关于这个主题的书已经结束了,这是编译器的工作,在这里。编译器根据test是什么来计算调用哪个重载

test.call();

这调用了test的虚拟方法。由于test实际上是B,因此这将调用B的重写虚拟方法。这就是虚拟方法在C++中的工作方式。

猜猜B会发生什么?

void call() override { h(*this); }

由于*this的类型是B &,所以它就是被调用的重载。这里没有什么好说的了。结束。关于这个主题的书已经结束了,这是编译器的工作。编译器根据*this是什么来计算调用哪个重载

最新更新