C++ 重载 覆盖 隐藏

一,重载(overload)的定义

在同一可访问区内被声名的几个具有不同参数列表的(参数的类型、个数、顺序不同)同名函数,编译器会根据不同的参数列表来确定具体调用哪个函数,这种机制叫重载。重载不关心函数的返回值类型。但是,只有返回值相同的同名函数,才有可能构成重载关系。


二,函数重载(overload)注意的问题

1,在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序。

2,不能通过访问权限、返回类型进行重载。


三,覆盖(override)的定义

覆盖是指派生类中存在重新定义的函数,其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体(花括号中的部分)不同,覆盖是一个类的多态性的体现。


四,覆盖(override)注意的问题

1,覆盖的方法的特征标必须要和被覆盖的方法的特征标完全匹配,才能达到覆盖的效果。

2,覆盖的方法的返回值必须和被覆盖的方法的返回一致。

3,被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

4,基类的函数名前必须有virtual关键字,如果没有virtual关键字,那就是隐藏。


五,隐藏的定义

隐藏是指派生类的函数屏蔽了与其同名的基类函数。


六,隐藏应注意的问题

1,如果派生类的函数与基类的函数同名但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。

#include<iostream>
using namespace std;

class Base{
public:
    virtual void f1(int x, double y){
        cout<<"virtual void f1(int x, double y)"<<endl;
    }
    void f1(){
        cout<<"void f1()"<<endl;
    }
};

class Derived : public Base{
public:
    void f1(int x){
        cout<<"void f1(int x)"<<endl;
    }
};

int main(){
    int x = 10;
    Derived obj;
    obj.f1();
    return 0;
}
上面的代码在编译时会出错,因为派生类的名为f1的函数,会屏蔽从基类继承过来的名为void  f1()的非虚函数,也会屏蔽从基类继承过来的名为virtual  void  f1(int  x,  int  y)的虚函数,屏蔽了的这些函数对派生类对象来说都是不可见的,因此派生类的对象直接调用f1()会出错。

2,如果派生类的函数与基类的函数同名,并且参数也相同但是基类函数没有virtual关键字。此时,基类的函数被隐藏。


七,实例代码

1,代码实例

#include<iostream>
using namespace std;

class Base{
public:
    void f1(){
        cout<<"void f1()"<<endl;
    }
    void f1(int x){
        cout<<"void f1(int x)"<<endl;
    }
};

class Derived : public Base{
public:
    void f1(int x, double y){
        cout<<"void f1(int x, double y)"<<endl;
    }
};

int main(){
    int x = 10;
    Derived obj;
    obj.f1(x);
    return 0;
}
 

2,代码分析

上面的函数在编译时会出错,因为在Derived类中声明的f1函数,屏蔽了从基类继承过来的同名函数,也就是说基类的void  f1()与void  f1(int  x)函数对Drived对象来说是不可见的,因此当Derived对象调用void  f1(int   x)函数时会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值