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

C++ Overloaded function, one takes takes argument of base class, another takes argument of derived class

本文关键字:参数 基类 另一个 派生 一个 函数 重载 C++      更新时间:2023-10-16

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

我有类 A,派生自 A 的派生类 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);

究竟选择调用的规则是什么?声明重载函数的顺序是否重要?

选择调用的规则到底是什么?

重载解决规则。它们在标准的[over.match]部分中进行了描述。该部分大约有 20 页长,因此简洁的描述可能会有所帮助:其论点明确要求最少转换的候选人是首选。

声明重载函数的顺序是否重要?

是的,但仅与函数调用有关。仅考虑已声明的重载:

void print(A*);
void foo() {
B* ptr = nullptr;
print(ptr); // will call void print(A*)
}
void print(B*);

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

顺序无关紧要。规则是这样的,必须采取最具体的重载 - 在这种情况下是 B 版本。

另请注意,函数调用是在编译时插入的 - 也就是说,它不依赖于实际的运行时类型,因此不会插入虚拟/动态查找。所以你应该改成

A* bObj = new B;
print(bObj);

然后调用函数 takeA*