zoukankan      html  css  js  c++  java
  • C++之重载覆盖和隐藏

    继承体系下同名成员函数的三种关系

    • 重载
    1. 在同一作用域内
    2. 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同)
    3. 返回值类型可以相同也可以不同
    • 重写(覆盖)
    1. 在不同作用域内,分别在父类和子类
    2. 函数名相同,参数列表相同,返回值类型相同,协变除外(下面会介绍什么是协变)
    3. 基类函数必须有virtual关键字修饰
    4. 父子类中函数的访问修饰符可以不同
    • 重定义(隐藏)
    1. 在不同的作用域内,分别是父类和子类
    2. 函数名相同
    3. 在基类和派生类中只要不构成重写的都是重定义

    重载

    C++中函数重载达到的效果:

    调用函数名相同的函数,根据实参的类型和个数选择相应的实现函数体执行。

    函数重载是一种静态多态,或者称之为静态联编、静态绑定、静态决议,其实都一样。

    重写/覆盖

    在子类中定义一个与父类中完全相同的虚函数:

    1. 父类和子类中的虚函数,函数名、参数个数、参数类型以及返回值类型都相同,构成重写。
    2. 子类中的虚函数与父类中的虚函数,函数名、参数个数和类型都相同,只是返回值不同,父类的虚函数返回父类的指针或引用,子类虚函数返回子类的指针或引用,这种情况下也构成重写,我们称之为协变

    C++中函数重写达到的效果:

    在子类中重写了父类的虚函数,则子类对象调用该重写函数时从子类内部调用,而不是从父类继承,是一种动态多态。

    在子类中重写了父类的虚函数,如果用一个父类指针或引用指向子类对象,那么该指针调用的是重写的虚函数,也即是子类的虚函数, 而如果一个父类指针指向父类对象,则调用父类的虚函数。

    重定义/隐藏

    指的是在不同作用域内,函数名相同,但不构成重写的则构成重定义。不仅仅是指类的成员函数,也可以是类的成员变量。

    C++中重定义达到的效果:

    对于在父类和子类中有相同名字的成员,子类会将父类成员隐藏,此时无论在子类内部还是外部,通过子类成员对象访问该成员,访问到的都是子类同名成员。

    如果在子类内部或外部通过子类成员访问同名成员函数,则需要根据函数调用的规则来调用子类的同名成员函数,否则调用失败。

  • 相关阅读:
    LINQ查询表达式(5)
    LINQ查询表达式(4)
    并不对劲的loj2279
    并不对劲的bzoj1563:p1912:[NOI2009]诗人小G
    并不对劲的loj507
    并不对劲的loj2332
    并不对劲的loj6191
    并不对劲的bzoj4552:p2824:[HEOI2016/TJOI2016]排序
    并不对劲的bzoj3924:loj2135:p3345:[ZJOI2015]幻想乡战略游戏
    并不对劲的bzoj3295:[CQOI2011]动态逆序对
  • 原文地址:https://www.cnblogs.com/phillee/p/10883840.html
Copyright © 2011-2022 走看看