2

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

4

2 回答 2

2

这是由于函数解析规则。

在本次通话中:

sc.eq(c1);

一旦 c1 是动态重载的类型struct C,只有一个函数可以被调用。eq

但在通话中

sc.eq(sc);

你有两个可能的eq函数被调用。第一个是在struct C动态重载中声明eq的,第二个是在中声明的struct SC。一次sc是类型struct SC,最后一种方法比前者更可行。

这就是你得到3结果的原因。

于 2013-10-17T21:26:41.983 回答
2

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

sc.eq(c1);

编译器将分派给 的动态类型sc,但会使用 的静态类型c1

于 2013-10-17T21:13:42.143 回答