c++ - 为什么 `*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 似乎总是知道它是哪个子类,而通常我们在将子类初始化为父类(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/

相关文章:

c++ - 为什么使用转换为 int,而不是 bool?

php - 改进 PHP 中的类结构而不是使用多重继承

php - 面向过程程序员的 OOP

objective-c - 在 NSObject 子类的自定义 init 方法中使用 self = [super init]

c++ - MSVC 无法向上转换 unique_ptr

c++ - 在窗口模式下设置/获取我的绝对鼠标位置

C++ 奇怪的 RAW 套接字和 iptables 问题

c++ - 添加带有参数包扩展的所有参数

design-patterns - 什么时候使用哪种模式?

php - 依赖注入(inject)还是范围解析运算符?