C++具有虚拟继承的重载方法绑定

C++ overloaded method binding with virtual inheritance

本文关键字:重载 方法 绑定 继承 虚拟 C++      更新时间:2023-10-16

好的,所以我有一个与以下代码的输出有关的问题(这是111222223)

#include <iostream>
struct C {
 virtual int eq(const C& other) const { return 1; }
};
struct SC : C {
 virtual int eq(const C& other) const { return 2; } 
 virtual int eq(const SC& other) const { return 3; }
};
void go(const C& c, const C& c1, const SC& sc) {
 using namespace std;
 cout << c.eq(c) << endl;
 cout << c.eq(c1) << endl;
 cout << c.eq(sc) << endl;
 cout << c1.eq(c) << endl;
 cout << c1.eq(c1) << endl;
 cout << c1.eq(sc) << endl;
 cout << sc.eq(c) << endl;
 cout << sc.eq(c1) << endl;
 cout << sc.eq(sc) << endl;
}
int main(int argc, const char* argv[]) { 
 go(C(), SC(), SC());
 return 0;
}

所以我明白我正在使用带有引用的点运算符,该引用将根据调用者的运行时类型动态绑定正确的虚拟方法(需要 -> 带有指针,但可以在这里进行动态思维)。我不明白的是为什么倒数第二个 cout 行打印"2"而不是"3"。这是因为方法签名是静态的,所以方法是根据正确的派生类型 SC 中的静态签名选择的吗?提前感谢您的帮助!

在C++中,不支持多次调度,只支持调用函数的对象(动态调度仅适用于this指针)。在表达式中:

sc.eq(c1);

编译器将调度到动态类型的sc,但将使用静态类型的c1

这是由于函数解析规则。

在此通话中:

sc.eq(c1);

一旦 c1 属于动态重载的 struct C 类型,eq,只有一个函数可以清晰地调用。

但在通话中

sc.eq(sc);

您有两个可能的 eq 函数要调用。第一个是用动态重载eq struct C声明的,第二个是用 struct SC 声明的。一旦sc属于struct SC类型,最后一种方法比前一种方法更可行。

这就是为什么你会因此而3