重载、隐藏、覆写(重写)的区别

重载

函数重载是指在同一个作用域内,可以定义多个同名函数,但它们的参数类型或个数不同。编译器根据调用时提供的参数类型或个数来决定调用哪个具体的函数。函数重载使得我们可以用相同的函数名实现不同的功能,从而增强了代码的可读性和灵活性。

例如,假设我们有一个计算两个整数之和的函数:

int add(int a, int b) { return a + b; }

我们可以通过函数重载,实现对不同数据类型的加法:

double add(double a, double b) { return a + b; }

在调用时,编译器会根据提供的参数类型自动选择适合的函数进行调用:

int result1 = add(2, 3); // 调用第一个add函数,返回整数结果5 
double result2 = add(2.5, 3.7); // 调用第二个add函数,返回浮点数结果 6.2

 隐藏

函数隐藏是指在派生类中定义了一个与基类中函数名称相同的函数(无论参数是否相同),这样就会隐藏基类的同名函数。当使用派生类对象调用该函数时,将只能访问派生类中定义的同名函数,而无法访问基类中的函数。

函数隐藏主要发生在继承关系中,它与函数重载不同,函数重载是在同一个类中定义多个同名函数,而函数隐藏涉及到派生类和基类之间的名称冲突。

例如,考虑以下基类和派生类:

class Base { 
public: 
    void display() {
         cout << "Base class display()" << endl; 
    } 
}; 
class Derived : public Base { 
public: 
    void display() {
         cout << "Derived class display()" << endl; 
    } 
};

在这个例子中,派生类Derived中定义了一个与基类Base中函数display()同名的函数。如果我们创建Derived类的对象并调用display()函数,将会隐藏基类中的同名函数:

Derived obj; obj.display(); // 输出 "Derived class display()"

如果你希望在派生类中调用基类的同名函数,可以使用作用域解析运算符::

Derived obj; obj.Base::display(); // 输出 "Base class display()"

 覆写

函数覆写是指在派生类中定义了一个与基类中函数名称相同的虚函数,这样就会使基类的同名虚函数被重写。当使用派生类对象调用该函数时,将只能访问派生类中定义的同名虚函数,而无法访问基类中的虚函数。

函数覆写主要发生在继承关系中,它与函数隐藏不同,函数隐藏只是将基类中的同名函数隐藏,而函数覆写涉及到派生类将基类中的函数重写。

例如,考虑以下基类和派生类:

class Base {
public:
    virtual void someFunction() {
        std::cout << "Base class virtual function" << std::endl;
    }
};
class Derived : public Base {
public:
    void someFunction() { 
        std::cout << "Derived class overridden function" << std::endl;
    }
};

此时如果创建Derived对象,则无法通过.Base:: 再去调用基类中的someFunction函数。

最后,写文不易,不收藏也请给个赞,谢谢亲~! 

(本文仅供学习时参考,如有错误,纯属作者技术不到位,不足之处请多指教,谢谢)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值