好的,我有一个与以下代码输出有关的问题(即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;
}
所以我理解我正在使用带有引用的点运算符,该引用将根据调用者的运行时类型动态绑定正确的虚方法(需要 - &gt;指针,但这里可以动态管理)。我不明白为什么第二个到最后一个cout行打印'2'而不是'3'。这是因为方法签名是静态的,所以根据正确派生类型SC中的静态签名选择方法吗?感谢您的帮助!
答案 0 :(得分:2)
在C ++中,不支持多个调度,仅适用于调用该函数的对象(动态调度仅适用于this
指针)。在表达式中:
sc.eq(c1);
编译器将调度到动态类型sc
,但将使用静态类型c1
答案 1 :(得分:2)
这是由功能解析规则引起的。
在此电话会议中:
sc.eq(c1);
一旦c1的类型struct C
eq
动态过载,就只能调用一个函数。
但是在电话中
sc.eq(sc);
您可以调用两个可能的eq
函数。第一个在struct C
中声明,动态重载eq
,第二个是在struct SC
中声明的那个。 sc
类型为struct SC
后,最后一种方法比前者更可行。
这就是为什么你得到3
的结果。