C++子类父类成员函数的覆盖和隐藏
覆盖(Override)
当子类定义了与父类相同名称、参数列表和返回类型的成员函数时,子类的成员函数会覆盖父类的同名函数,称之为覆盖。
实现方式是使用 override
关键字表明该函数是对基类函数的重写,子类中的该函数将取代基类中的同名函数。如果子类中未找到需要重写的函数,编译器会给出错误提示。
假设有一个基类 Shape
,有 area()
成员函数,以及两个派生类 Square
和 Circle
,都拥有自己的实现方式,具体代码如下:
#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() { // virtual表示此函数可被子类覆盖
cout << "Shape class area" << endl;
return 0;
}
};
class Square: public Shape {
public:
double area() override { // 对Shape中的area()进行重写
cout << "Square class area" << endl;
return 0;
}
};
class Circle: public Shape {
public:
double area() override { // 对Shape中的area()进行重写
cout << "Circle class area" << endl;
return 0;
}
};
int main() {
Shape *shape;
Square square;
Circle circle;
shape = □
shape->area();
shape = &circle;
shape->area();
return 0;
}
输出结果为:
Square class area
Circle class area
需要注意以下几点:
- 使用
virtual
关键字声明一个成员函数,表示这个成员函数可以被子类重写。 - 在子类中,当你定义了一个与基类相同名称的成员函数时,该函数就自动地隐藏了基类中的成员函数。
- 使用
override
关键字表明该函数是对基类函数的重写,可以增加可读性和代码安全,有效避免在子类时误拼写同名函数的情况。
隐藏(Hide)
子类如果有和父类同名函数,但参数不同,此时子类成员函数将会隐藏父类成员函数,称之为隐藏。
对于 C++ 中的隐藏,可以简单理解为父类中的同名成员函数被覆盖(隐藏),因为在子类中提供了新的成员函数。与覆盖不同的是,子类的新成员函数与父类的同名成员函数具有相同的名称,但就其功能而言,它们具有完全不同的实现。
以下是一个示例:
#include <iostream>
using namespace std;
class Shape {
public:
virtual void draw() {
cout << "Shape draw function." << endl;
}
};
class Rectangle : public Shape {
public:
void draw() {
cout << "Rectangle draw function." << endl;
}
};
class Square : public Shape {
public:
void draw(int n) {
cout << "Square draw function, side = " << n << endl;
}
};
int main() {
Shape *s;
Rectangle r;
Square s1;
s = &r;
s->draw();
s = &s1;
s->draw();
return 0;
}
输出结果为:
Rectangle draw function.
Shape draw function.
需要注意以下几点:
- 在派生类中重新定义了与基类中同名而切参数不相同的成员函数,就称该派生类中的成员函数隐藏了基类成员函数。
- 如果希望在子类中仍然能调用被隐藏的父类成员函数,可以使用作用域解析运算符
::
,例如Rectangle::draw()
即可访问基类的draw()
函数。
总结
- 子类如果有和父类同名函数,但参数不同,此时子类成员函数将会隐藏父类成员函数,称之为隐藏。
- 子类定义了继承自父类的同名函数,该子类函数会覆盖父类中的成员函数,称之为覆盖。
- 覆盖是一个特殊的隐藏。
- 覆盖要求子类成员函数和父类成员函数的名称、参数列表和返回类型完全一致。
- 在子类中,可以使用
override
关键字明确指定成员函数是对基类中的同一成员函数的重载,增加代码的可读性和安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++子类父类成员函数的覆盖和隐藏实例详解 - Python技术站