C++深入探究重载、重写、覆盖的区别
在C++中,有三种不同的函数使用方法:重载(Overloading)、重写(Overriding)和覆盖(Hiding)。虽然它们有些相似之处,但它们各自有不同的用途和行为。以下是它们的详细解释。
重载(Overloading)
重载是指定义多个具有相同名称(函数名)但不同参数列表(参数类型、参数个数或参数顺序)的函数。在调用函数时,根据传递给函数的参数自动匹配相应的函数进行调用。例如:
#include <iostream>
using namespace std;
// 函数重载
int add(int a, int b){
return a + b;
}
double add(double a, double b){
return a + b;
}
int main(){
int x = add(3, 4);
double y = add(2.5, 3.1);
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
}
以上代码定义了两个名为“add”的函数,一个函数接收两个整数参数,另一个函数接收两个双精度浮点数参数。在main
函数中,通过传递不同类型的参数来调用不同版本的add
函数。这是函数重载的例子。
重写(Overriding)
重写是通过继承,使用派生类中的成员函数来覆盖基类中的同名成员函数。在派生类中实现与基类函数原型相同的函数,这样可以隐藏基类中的函数。例如:
#include <iostream>
using namespace std;
// 基类
class Shape{
public:
void draw(){
cout << "Drawing a Shape" << endl;
}
};
// 派生类
class Rectangle:public Shape{
public:
void draw(){
cout << "Drawing a Rectangle" << endl;
}
};
int main(){
Shape* shape = new Shape();
shape->draw();
Rectangle* rect = new Rectangle();
rect->draw();
Shape* rect2 = new Rectangle();
rect2->draw();
return 0;
}
以上代码中,我们定义了一个基类Shape
和一个派生类Rectangle
。在Rectangle
类中,我们重新实现了draw
函数。在main
函数中,我们分别创建了基类Shape
和派生类Rectangle
对象,并进行了函数调用。注意,当我们创建一个基类指针,指向其派生类的对象时,我们只能调用基类中存在的函数,不能调用派生类中的同名函数。这是因为,指针是基类类型,它只知道基类中存在哪些函数,而不知道派生类中的同名函数。
覆盖(Hiding)
覆盖是指派生类中的函数名与基类中的函数名相同,但参数列表不同。在此情况下,基类的函数将被隐藏,而不是被重写。例如:
#include <iostream>
using namespace std;
// 基类
class Shape{
public:
void draw(){
cout << "Drawing a Shape" << endl;
}
};
// 派生类
class Rectangle:public Shape{
public:
void draw(int width, int height){
cout << "Drawing a Rectangle, width = " << width << ", height = " << height << endl;
}
};
int main(){
Shape* shape = new Shape();
shape->draw();
Rectangle* rect = new Rectangle();
rect->draw(10, 5);
Shape* rect2 = new Rectangle();
// 下面一行代码无法编译,因为Shape类没有draw(int, int)函数
// rect2->draw(8, 6);
return 0;
}
以上代码中我们同样定义了一个基类Shape
和一个派生类Rectangle
。在Rectangle
类中,我们定义了一个名为draw
的函数,其参数列表与基类中的draw
函数不同。在main
函数中,我们分别创建了基类Shape
和派生类Rectangle
对象,并进行了函数调用。注意,当我们创建一个基类指针,指向其派生类的对象时,并尝试调用派生类中的不存在于基类的函数(单纯继承),编译器会显示编译错误。
以上就是C++中函数重载、函数重写、函数覆盖三种不同的函数使用方法的详细解释。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++深入探究重载重写覆盖的区别 - Python技术站