C ++重载函数,一个接受基类的参数,另一个接受派生类的参数

时间:2018-10-18 11:17:06

标签: c++

很抱歉,如果这是一个重复的问题,但我自己找不到任何相关结果。

我有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);

选择呼叫的规则到底是什么?声明重载函数的顺序是否重要?

2 个答案:

答案 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*);

否则,声明的顺序并不重要。