C++重载与覆盖的区别

    重载(overload:是指编写一个与已知函数同名但是参数表不同的函数。重载主要属于静态编联范畴,是在编译期就完成地址的分配。

    普通成员函数的重载主要分成三部分:

(1)在一个类中说明重载。

如 show(int a,char b);//在编译期经过编译器修饰后函数名会变成int_char_show

   show(char* c,double d);//在编译期经过编译器修饰后函数名会变成char_double_show

(2)在基类中声明一个函数,在子类中重载这个函数(未声明virtual关键字)(还有一种说法是隐藏,但我认为可以简单的认为是一种特殊的重载更确切,不考虑这个两个函数具有相同的参数),经过编译期之后,有三种编译区分的方法:

1.根据参数特征进行区分。

如  Base: show(int ,int );

    Derived:  show(int ,float);

这两个函数不是一个函数,编译器可以区分

2.根据“::”作用域符进行区分。编译器进行编译时,可根据不同的作用域进行区分重载函数。

如  Base::show( );

    Derived::show( );

3.根据类对象进行区分调用哪一个重载函数。

如  Base b; b.show( );

    Derived d; d.show( );

由上可知,重载只是一种语言特性,与多态无关,与面向对象无关。

    覆盖(override):是指派生类重写基类的虚函数,重写的函数必须具有一致的参数表和返回值。覆盖是一种动态编联。在运行期进行确定所调用的函数地址。

覆盖是与多态密切相关的一种机制,与面向对象有关。

以下通过一个程序来说明重载与覆盖:

#include<iostream>
using namespace std;

class A
{
public:
A(int data = 0):m_data(data){}
virtual int doGetData()
{
return m_data;
}
int GetData()
{
return doGetData();
}
private:
int m_data;
};
class B:public A
{
public:
B(int data = 1):m_data(data){}
int doGetData()
{
return m_data;
}
private:
int m_data;
};
class C:public B
{
public:
C(int data=2):m_data(data){}
private:
int m_data;
};
int main(int argc, char* argv[])
{
C c(10);
/* C c(10);构造函数先调用A()默认构造函数,然后调用B()默认构造函数,最后才调用C的构造函数。 */
cout<<c.GetData()<<endl;
/*本来是调用C类的GetData(),C中未定义,故调用继承B中的函数,但是B中也未定义,故调用继承A中的GetData()函数,因为A中的doGetData()是
虚函数且c对象是C类型的,所以优先调用C类中的doGetData()函数,由于C类中未定义doGetData()函数,所以调用B类中的doGetData(),而B类中返回的是
this.m_data等价于B::m_data.因此输出为1.
*/
cout<<c.A::GetData()<<endl;
/*c.A::GetData调用的是A类的GetData()函数,由于A中的doGetData()是虚函数,又因为C类中未定义该接口,所以调用B类中的doGetData(),而B类中返回的是
this.m_data等价于B::m_data.因此输出为1.
*/
cout<<c.B::doGetData()<<endl;//结果为1,理由同上。
cout<<c.C::GetData()<<endl;//结果为1 ,理由同上。
cout<<c.doGetData()<<endl;//由于C类中未定义虚函数doGetData()的接口,所以会调用父类的接口。结果为1.
cout<<c.A::doGetData()<<endl;//c.A::doGetData(),C类对象会直接调用A类的作用域内的内存空间,直接调用A的doGetData(),结果为0.
cout<<c.C::doGetData()<<endl;//因为C类为重定义该接口,所以调用B类的doGetd(),而B类的doGetData()返回B::m_data,故输出为1.
/*这里要注意存在一个就近调用,如果父类存在相关的接口则优先调用父类接口,否则调用祖父类接口。*/
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值