深度解析C++重载、隐藏、重写

发布于:2024-07-10 ⋅ 阅读:(138) ⋅ 点赞:(0)

重载

函数重载是指两个函数在同一个作用域并且函数名相同参数(参数个数或类型或类型顺序
)不同
的一种特殊情况

// 1、参数类型不同
int Add(int left, int right){
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
double Add(double left, double right){
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}
// 2、参数个数不同
void func(){
    cout << "func()" << endl;
}
void func(int a){
    cout << "func(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b){
    cout << "func(int a,char b)" << endl;
}
void func(char b, int a){
    cout << "func(char b, int a)" << endl;
}

隐藏

隐藏又叫做重定义,是指两个成员函数分别在基类和派生类的作用域,并且函数名相同就构成了隐藏。

class A{                // 基类
public:
    void fun()
    {
        cout << "func()" << endl;
    }
};
class B : public A{     // 派生类
public:
    void fun(int i)     // 与基类的成员函数名相同,构成隐藏
    {
        cout << "func(int i)" <<i<<endl;
    }
}

重写

重写又称为覆盖,是指两个虚函数分别在基类和派生类的作用域,并且函数名、参数、返回值都相同(协变例外)的两个虚函数,构成重写。

class Person {                        // 基类
public:
    virtual void BuyTicket() 
    { 
        cout << "买票-全价" << endl; 
    }
};
class Student : public Person {       // 派生类
public:
    // 与基类的函数名、返回值、参数列表都相同,构成重写
    virtual void BuyTicket()          
    { 
        cout << "买票-半价" << endl; 
    }
}

注意:析构函数的重写允许函数名不同。 如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同,看起来违背了重写的规则,其实不然,编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor。

总结

从定义上看隐藏包含着重写,即重写是一种特殊的隐藏,只要两个基类和派生类的同名函数不构成重写,那么它就是隐藏;而重载与 隐藏和重写 最大的区别就是两个函数是不是在同一个作用域


网站公告

今日签到

点亮在社区的每一天
去签到