C++中的覆盖和隐藏详解
在C++中,派生类可以继承父类的成员函数。当派生类中的函数与父类中的函数同名时,就会产生覆盖和隐藏的问题。下面就来详细讲解一下C++中的覆盖和隐藏。
覆盖(Override)
覆盖指的是派生类中的函数与父类中的函数同名、同参数列表,且返回类型相同。此时,派生类中的函数将覆盖掉父类中的函数,成为继承关系中的新定义。
在派生类的成员函数中,使用virtual
关键字可以指定该函数为虚函数,从而实现覆盖。派生类中的覆盖函数可以使用override
关键字来显式的表明这是一个覆盖函数,这样可以方便编译器检查是否真正的进行了覆盖。
示例代码如下:
#include <iostream>
using namespace std;
class Shape {
public:
virtual void draw() {
cout << "Drawing Shape" << endl;
}
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
int main() {
Shape *s = new Circle;
s->draw(); // 输出 "Drawing Circle"
delete s;
return 0;
}
在上述代码中,Shape
类中的draw()
函数被声明为虚函数,且其有一个派生类Circle
,在Circle
类中重写了基类函数draw()
,用于绘制圆形。在main
函数中,通过将一个Circle
类的对象指针转为一个基类指针用以调用Shape
类中的虚函数draw()
,结果输出了"Drawing Circle"表示执行了Circle
类的draw()
函数。
隐藏(Hide)
隐藏指的是派生类中的函数与父类中的函数同名,但参数列表不同。此时,派生类的函数将隐藏父类的同名函数,不再具有覆盖父类同名函数的功能。
示例代码如下:
#include <iostream>
using namespace std;
class Shape {
public:
void draw() {
cout << "Drawing Shape" << endl;
}
void draw(int num) {
cout << "Drawing " << num << " Shapes" << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Drawing Circle" << endl;
}
void draw(double radius) {
cout << "Drawing Circle with radius " << radius << endl;
}
};
int main() {
Shape s;
Circle c;
s.draw(); // 输出 "Drawing Shape"
s.draw(2); // 输出 "Drawing 2 Shapes"
c.draw(); // 输出 "Drawing Circle"
c.draw(2.5); // 输出 "Drawing Circle with radius 2.5"
// c.draw(2); // 编译错误,因为Circle类中没有draw(int)函数,只有draw(double)。
return 0;
}
在上述代码中,Shape
类中的draw()
函数有两个重载版本,一个是无参的版本,一个是带有一个int
类型参数的版本。Circle
类中也有一个同名函数draw()
,但没有重载draw(int)
函数,反而增加了一个带有一个double
类型参数的函数。在main
函数中,Shape
类和Circle
类各调用两个版本的draw()
函数,而Circle
类的调用中没有使用到int
类型版本的函数,由于派生类的函数名与基类函数名相同但参数列表不同,Circle
类中重载的draw(double)
函数隐藏了基类中的所有draw()
函数。
以上就是C++中的覆盖和隐藏的详细讲解。其中,覆盖是实现多态性的关键机制之一,隐藏则不利于代码的调试和维护,应尽量避免使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中的覆盖和隐藏详解 - Python技术站