首页 > 其他分享 >什么是重载、重写、隐藏?

什么是重载、重写、隐藏?

时间:2024-09-06 10:24:31浏览次数:12  
标签:函数 子类 重载 父类 重写 隐藏

目录

前言

1. 重载(Overloading)

2. 重写(Overriding)

3. 隐藏(Hiding)


前言

在面向对象编程中,重载重写隐藏是三种不同的概念,通常用于方法或函数的定义。它们的主要区别在于应用的场景、规则,以及发生的时间点。

  • 重载(Overloading):在同一个作用域中,多个同名函数,参数列表不同,返回类型可以相同或不同。常用于提供不同的参数组合的多种实现。
  • 重写(Overriding):子类重新实现父类的虚函数,函数签名必须相同,实现动态多态性。
  • 隐藏(Hiding):子类定义了一个与父类同名但非虚函数的函数,函数可能参数不同。子类的函数隐藏了父类的函数,静态绑定在编译时决定调用哪个版本。

1. 重载(Overloading)

重载是指在同一个作用域内,定义多个同名的函数或方法,但它们的参数列表不同(参数的个数或类型不同),以实现不同的功能。重载的主要特征是函数名相同,参数列表不同,与返回类型无关。

特点:

  • 同名函数:函数名相同。
  • 参数列表不同:参数的类型、数量或顺序不同。
  • 与返回值无关:重载不依赖于返回类型。

示例:

class Math {
public:
    int add(int a, int b) {
        return a + b;
    }

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

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

在这个例子中,函数 add 被重载了三次。尽管函数名相同,但参数的类型和数量不同,因此编译器能够根据传入参数的类型和数量来选择正确的函数。

使用场景:

重载通常用于当同一个操作可以对不同类型或不同数量的参数执行时,让代码更加简洁和易于理解。

2. 重写(Overriding)

重写是指在子类中重新定义从父类继承的函数,以改变其行为。重写的前提是父类的函数必须是虚函数(在 C++ 中使用 virtual 关键字),子类通过相同的函数签名(包括函数名、参数和返回类型)来重新实现该函数。

特点:

  • 继承关系:必须有继承关系,子类重写父类的虚函数。
  • 函数签名相同:函数名、参数列表、返回类型必须与父类中的函数相同。
  • 动态多态性:通过指向父类的指针或引用来调用重写的函数时,执行的是子类的实现(基于动态绑定)。

示例:

class Animal {
public:
    virtual void sound() {
        std::cout << "Animal sound" << std::endl;
    }
};

class Dog : public Animal {
public:
    void sound() override {
        std::cout << "Bark" << std::endl;
    }
};

在这个例子中,Dog 类重写了 Animal 类中的 sound 函数。尽管父类和子类都有 sound 函数,但调用 Dogsound 函数时,会输出 Bark,这是子类对父类方法的重写。

使用场景:

重写通常用于实现动态多态性,即允许子类提供不同的实现以替代父类的方法,特别是在设计抽象类或接口时非常常见。

3. 隐藏(Hiding)

隐藏是指在子类中定义了一个与父类同名的函数,但该函数不是重写父类的虚函数,通常是由于没有使用 virtual 关键字。此时,子类的函数会隐藏父类的同名函数,不管参数是否相同。调用隐藏的函数时,函数的选择依赖于指针或对象的静态类型(即编译时的类型),而不是动态类型。

特点:

  • 继承关系:同样发生在继承关系中,但与重写不同的是,父类的函数不是虚函数,或者子类定义的函数与父类函数签名不同。
  • 同名但不覆盖:子类的函数与父类的同名函数不会相互覆盖,而是隐藏父类的函数。
  • 静态绑定:根据对象的静态类型调用函数,而不是动态类型。

示例:

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

class Derived : public Base {
public:
    void display() {  // 非虚函数,隐藏了基类的 display
        std::cout << "Derived class display" << std::endl;
    }
};

在这个例子中,Derived 类中的 display 函数隐藏了 Base 类的同名函数。即使通过 Derived 类的对象调用 display,父类的 display 函数也不会被调用,除非通过显式调用 Base::display()

使用场景:

函数隐藏一般是无意发生的,可能会导致意想不到的行为,因此通常不推荐使用。可以通过显式指定作用域来调用被隐藏的函数,例如 Base::display()

标签:函数,子类,重载,父类,重写,隐藏
From: https://blog.csdn.net/weixin_47151388/article/details/141952735

相关文章

  • 深度解析C++中函数重载与引用
    ......
  • 网站提示“Apache/Nginx配置错误:如虚拟主机配置错误、重写规则错误等”错误如何解决
    当您遇到“Apache/Nginx配置错误”,如虚拟主机配置错误、重写规则错误等问题时,这通常意味着您的Web服务器配置文件中存在一些问题,导致服务无法正常工作或某些功能无法正常使用。以下是一些解决这类问题的方法:Apache配置错误1.检查虚拟主机配置定位配置文件:Apache的虚拟主机......
  • 12 Python面向对象编程:运算符重载
    本篇是Python系列教程第12篇,更多内容敬请访问我的Python合集在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在......
  • PHP8面向对象快速入门四 类的多态 方法重载
    在面向对象编程中,多态是指相同的操作或方法可以作用于不同的对象,从而产生不同的结果。方法重写方法重写是子类提供对从父类继承的方法的特定实现。这是实现多态的一种方式。方法重写允许子类提供具体的实现,而不是使用父类中定义的实现。示例: <?phpclassAnimal{pub......
  • 12 Python面向对象编程:运算符重载
    本篇是Python系列教程第12篇,更多内容敬请访问我的Python合集在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面......
  • 『功能项目』主角身旁召唤/隐藏坐骑【20】
    本章项目成果展示我们打开上一篇19坐骑UI搭建及脚本控制显/隐的项目,本章要做的事情是在坐骑UI界面点击召唤及隐藏坐骑的功能首先在外包中拖拽一个坐骑熊的预制体完全解压缩重命名为MountBear在资源文件夹Resources下的/预制体文件夹Prefabs下新建坐骑文件夹Mount......
  • c++ string类 重载实现(续)9月3日
    #include<iostream>#include<string>#include<cstring>classMystring{ private: intlen; char*str; public: Mystring() { str=nullptr; len=0; } Mystring(constchar*s) { len=strlen(s); str=newchar[len+1]; strcpy(s......
  • 如何隐藏源站IP?如何进行防护?
    高防IP是具备防护DDoS的分布式防御及高安全立体式防CC系统,通过智能调度系统对攻击流量进行分流和清洗,避免受攻击时更换业务IP和繁琐的接入过程,简便高效,SLA标准99.9%,为中小企业的业务提供安全保障。如何隐藏源站IP?CNAME接入:用户可以通过将业务域名指向高防IP提供的CNAME地址......
  • 如何通过SMB协议添加隐藏的共享路径映射为本地驱动器?
    要将远程服务器上的隐藏共享路径(如D:\wwwroot\WINCEAPI)映射为本地驱动器,你可以按照以下步骤操作:Windows系统打开文件资源管理器:按 Win+E 快捷键,或者在任务栏上点击文件夹图标。映射网络驱动器:在文件资源管理器的地址栏中输入 \\192.168.1.111,然后按Enter键。......
  • 【C++】类和对象2:默认成员函数+操作符重载
    本篇是类和对象的第二站......