重载,覆盖,隐藏的区别

成员函数的重载,覆盖,隐藏


(1)成员函数被重载的特征:相同的类范围,函数名字相同,参数不同,virtual 关键字可有可无。

(2)覆盖指派生类的函数覆盖基类函数,特征是分别位于基类和派生类,函数名字相同,参数相同,基类函数必须有virtual关键字

(3)隐藏是指派生类的函数屏蔽了与其同名的基类函数。1,派生类的函数与基类的函数同名,但是参数不同,

不论有无virtual关键字,基类的函数将被隐藏 2,派生类的函数与基类的函数同名,并且参数也相同,

但是基类函数没有virtual 关键字。此时,基类的函数被隐藏

3种情况怎么执行:重载:看参数;隐藏:用什么就调用什么;覆盖:调用派生类 。


class A
{
public:
static int a;
static void fun()
{
cout<<"A::static void fun()"<<endl;
}


virtual void fun1()
{
cout<<"A::virtual void fun1()"<<endl;
}


virtual void fun2(int a)
{
cout<<"A::virtual void fun2(int) :"<<a<<endl;
}

  void fun3(int a)
{
cout<<"A::void fun3(int) : "<<a<<endl;
}


};
class B : public A
{
public:
int b;
void fun1()       //覆盖基类的函数
{
cout<<"B::void fun1()"<<endl;
}
void fun2(double a)    //重载基类的函数
{
cout<<"B::virtual void fun2(double) :"<<a<<endl;
}
void fun3(int a)     //隐藏基类的函数
{
cout<<"B::void fun3(int) :"<<a<<endl;
}
};
int A::a = 3;
int main()
{
A::fun();
A *a = new B();
cout<<"通过基类指针访问成员函数:---------"<<endl;
a->fun1();
a->fun2(3);
a->fun2(3.14);
a->fun3(5);
B *b = new B();
cout<<"通过子类指针访问成员函数:---------"<<endl;
b->fun();
b->fun1();
b->fun2(3);
b->fun2(3.14);
b->fun3(5);
return 0;
}

结果输出为:
/* 
 *::static void fun()
 通过基类指针访问成员函数:---------
 B::void fun1()
 A::virtual void fun2(int) :3
 A::virtual void fun2(int) :3
 A::void fun3(int) : 5
 通过子类指针访问成员函数:---------
 A::static void fun()
 B::void fun1()
 B::virtual void fun2(double) :3
 B::virtual void fun2(double) :3.14
 B::void fun3(int) :5
 * */

总结:

1,覆盖,也就是多态,基类函数名,参数与子类函数名,参数一致,基类函数为虚函数,访问的是子类的函数。

2,重载,函数名相同,参数不同,不管是不是虚函数。用什么类型的指针或引用访问的就是什么类型的函数,例如用基类指针指向子类类型,但用其访问基类和子类同名函数时,则访问的就是基类的函数,尽管调用的函数的参数与子类函数相同与基类不同,但也会转换为基类函数的参数类型,还是调用子类的函数。

3,隐藏,函数名和参数全相同,且基类函数不为虚函数。则不管基类指针指向的是基类类型还是子类类型,基类指针还是访问的是基类函数。即用什么类型指针或引用就访问什么类型的函数,与上面的相似。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值