覆盖、重载、隐藏
成员函数覆盖(override,也称重写)
是指派生类重新定义基类的虚函数,特征如下:
A、不同的作用域(分别位于派生类与基类)
B、函数名字相同
C、参数相同
D、基类函数必须有virtual关键字,不能有static
E、返回值相同
F、重写函数的权限访问限定符可以不同
成员函数重载(overload)
是指函数名相同,参数不同(数量、类型、次序),特征如下:
A、相同的范围(在同一个作用域中)
B、函数名字相同
C、参数不同
D、virtual 关键字可有可无
E、返回值可以不同
成员函数隐藏(也称重定义)
A、不在同一个作用域(分别位于派生类与基类)
B、函数名字相同
C、返回值可以不同
D、参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意与重载的区别)
E、参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意与覆盖的区别)
应用:定义形状类、矩形类、圆形类、正方形类
#include <iostream>
using namespace std;
class shape{
public:
virtual float cal_area() = 0; //纯虚函数 计算面积
virtual ~shape(){}; //虚析构
void prt_value(){cout<<"获取值"<<endl;} //打印属性
};
class rect:public shape{
private:
float length;
float width;
public:
rect(){}
//重载
rect(float l, float w):length(l),width(w){}
//覆盖
float cal_area(){return length*width;}
//隐藏
void prt_value(){
printf("length=%.2f width=%.2f\n", length, width);
}
};
class circle:public shape{
private:
float r;
public:
circle(int r){this->r = r;}
float cal_area(){return 3.14*r*r;}
void prt_value(){
printf("r=%.2f\n", r);
}
};
class square:public rect{
private:
float value;
public:
//初始化父类
square(int v):rect(v,v),value(v){}
};
测试和效果
int main()
{
shape *p; //多态
rect r(4,5); //长方形
p = &r;
float res = p->cal_area();
cout<<"矩形面积:"<<res<<endl;
r.prt_value();
circle c(3); //圆
p = &c;
res = p->cal_area();
cout<<"圆形面积:"<<res<<endl;
c.prt_value();
square s(5); //正方形
p = &s;
res = p->cal_area();
cout<<"正方形面积:"<<res<<endl;
s.prt_value();
return 0;
}

本文详细介绍了C++中成员函数的覆盖、重载和隐藏的概念及区别。通过实例展示了如何在派生类中覆盖基类的虚函数,实现函数重载,并解释了隐藏现象。同时,提供了具体的代码示例,包括形状类、矩形类、圆形类和正方形类的定义,以及多态的使用,以帮助读者理解这些概念的实际应用。
2345

被折叠的 条评论
为什么被折叠?



