C++ 中函数重载、覆盖与隐藏详解
什么是函数重载
C++ 中的函数重载是指在同一个作用域(Scope)内定义多个同名函数,但是他们的参数个数、参数类型、返回值类型中至少有一个不同。在调用函数时,编译器会根据传入的参数类型和个数的不同来判断调用哪一个函数。
下面是一个函数重载的简单示例:
#include <iostream>
using namespace std;
void print(int i) {
cout << "The integer value is " << i << endl;
}
void print(double f) {
cout << "The float value is " << f << endl;
}
int main() {
print(10); // 调用第一个 print 函数,输出 "The integer value is 10"
print(3.14); // 调用第二个 print 函数,输出 "The float value is 3.14"
return 0;
}
什么是函数覆盖
函数覆盖(Override)是指一个派生类中的成员函数覆盖了其基类中的同名函数,且参数列表必须完全匹配。在调用派生类对象的该函数时,会优先调用派生类中的函数,而不是基类中的函数。
下面是一个函数覆盖的示例:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void speak() { // 基类中的成员函数
cout << "This is an animal." << endl;
}
};
class Dog : public Animal {
public:
virtual void speak() { // 派生类中的成员函数,覆盖了基类中的 speak 函数
cout << "This is a dog." << endl;
}
};
int main() {
Animal * animalPtr;
Dog dog;
animalPtr = &dog;
animalPtr->speak(); // 输出 "This is a dog."
return 0;
}
什么是函数隐藏
函数隐藏(Hide)是指一个派生类中的成员函数隐藏了其基类中的同名函数,此时无论使用哪个类作为调用者,都只会调用派生类中的函数,不会调用基类的函数。函数隐藏与函数覆盖不同,因为隐藏函数必须与被隐藏函数在同一个作用域中,且参数列表不必匹配,只需要函数名相同即可。
下面是一个函数隐藏的示例:
#include <iostream>
using namespace std;
class Animal {
public:
void speak() { // 基类中的成员函数
cout << "This is an animal." << endl;
}
};
class Dog : public Animal {
public:
void speak(int i) { // 派生类中的成员函数,隐藏了基类中的 speak 函数
cout << "This is a dog." << endl;
}
};
int main() {
Animal animal;
Dog dog;
animal.speak(); // 输出 "This is an animal."
dog.speak(); // 输出 "This is a dog."
return 0;
}
总结:
- 函数重载是指在同一作用域内定义多个同名函数,但参数类型、个数、返回值类型至少有一个不同,编译器在调用时会根据参数类型和个数的不同来判断调用哪个函数。
- 函数覆盖是指派生类中的成员函数覆盖了其基类中的同名函数,且参数列表必须完全匹配,调用该函数时会优先调用派生类中的函数。
- 函数隐藏是指派生类中的成员函数隐藏了其基类中的同名函数,不论使用哪个类作为调用者,都只会调用派生类中的函数,函数参数列表不必匹配。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中函数重载、覆盖与隐藏详解 - Python技术站