C++具有虚拟继承的重载方法绑定
C++ overloaded method binding with virtual inheritance
好的,所以我有一个与以下代码的输出有关的问题(这是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
。
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 使用 nullptr 调用重载方法是不明确的
- 具有重载方法的可变参数数据结构
- C++11 重载方法,并转发到唯一方法
- 获取特定的模板重载方法指针
- std::result_of 应用于 const 重载方法
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 推导模板类重载方法的地址会导致"error: expected primary-expression before ‘decltype’"
- C++如何使用按值传递和按引用传递的重载方法
- 具有原始方法参数派生类的 C++ 重载方法参数
- SWIG:在派生类中处理基类重载方法
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- C++选择'wrong'默认参数的重载方法
- 重写重载方法会隐藏一些重载
- 在C++中,如何从父类变量的子类调用重载方法
- 所有重载方法的别名
- 使用 SWIG 在重载C++方法中设置类型