C ++重载方法绑定与虚拟继承

时间:2013-10-17 20:48:43

标签: c++ overloading virtual-inheritance method-signature

好的,我有一个与以下代码输出有关的问题(即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中的静态签名选择方法吗?感谢您的帮助!

2 个答案:

答案 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的结果。