很抱歉,如果这是一个重复的问题,但我自己找不到任何相关结果。
我有A类,派生自B的B类。
我有以下重载函数:
void print(A* obj) {
printf("This is an A object.");
}
void print(B* obj) {
printf(This is a B object.");
}
我主要执行以下操作。
B* bObj = new B;
print(bObj);
选择呼叫的规则到底是什么?声明重载函数的顺序是否重要?
答案 0 :(得分:1)
顺序无关紧要。规则是必须执行最具体的重载-在这种情况下为B版本。
还请注意,函数调用是在编译时插入的-也就是说,它不依赖于实际的运行时类型,因此不会插入虚拟/动态查找。所以你应该换成
A* bObj = new B;
print(bObj);
然后将调用对函数A*
的调用。
答案 1 :(得分:1)
选择呼叫的规则到底是什么?
重载解决规则。它们在标准的[over.match]部分中进行了描述。该部分长约20页,因此简洁的说明可能会有所帮助:首选参数明确要求最少转换的候选人。
重载函数的声明顺序重要吗?
是的,但仅与函数调用有关。仅考虑已经声明的重载:
void print(A*);
void foo() {
B* ptr = nullptr;
print(ptr); // will call void print(A*)
}
void print(B*);
否则,声明的顺序并不重要。