// 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
是什么来计算调用哪个重载