// 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
似乎总是知道它是哪个子类,而通常我们在将子类初始化为父类(super class)对象时会“丢失信息”。
幕后到底发生了什么让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
是什么来确定调用哪个重载。
关于c++ - 为什么 `*this` 解析为子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65227728/