C++:重载、覆盖与隐藏

C++之中的重载、覆盖、隐藏

  • 重载
  • 覆盖
  • 重载与覆盖的区别
  • 相关代码
  • 隐藏

重载

重载是指函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。在同一可访问区域内被声明的几个具有不同参数列表(参数类型、个数、顺序不同)的同名函数,程序会根据不同的参数列来确定具体调用哪个函数。对于重载函数的调用,在编译期间就已经确定,是静态的,它们的地址在编译期间就绑定了与多态无关。

注意:重载不关心函数的返回值类型



特征:

(1)相同的范围(在同一个类中)

(2)函数名字相同

(3)参数不同

(4)virtual 关键字可有可无

覆盖

覆盖是指派生类中存在重新定义基类的函数,其函数名、参数列、返回值类型必须同负类中的相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是负类中的被覆盖函数版本,它和多态真正相关。当子类重新定义了负类的虚函数后,负类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的。。



覆盖特征

(1)不同的范围(分别位于派生类与基类)

(2)函数名字相同

(3)参数相同

(4)基类函数必须有virtual关键字

重载与覆盖的区别

(1)覆盖是子类与父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系

(2)覆盖只能由一个方法,或只能由一堆方法产生关系:方法的重载是多个方法之间的关系。

(3)覆盖要求参数列表相同;重载要求参数列表不同

(4)覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定的,重载关系是根据调用时的实参表与形参表来选择方法体的

相关代码


// Base::f(int) 与 Base::f(float)相互重载
// Base::g(void) 被Derived::g(void)覆盖
#include<iostream>

using namespace std;

class Base
{

    public:
        void f( int x )
        {
            cout << "Base::f( int )" << x << endl;
        }
        void f(float x )
        {
            cout << "Base::f( float )" << x << endl;
        }

        virtual void g( void )
        {
            cout << "Base::g( void )" << endl;
        }

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

int main()
{
    Derived d;
    Base *pb = &d;

    pb->f( 42 );
    pb->f( 3.14f );
    pb->g();

    return 0;
}

隐藏

隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下

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

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

在调用一个类的成员函数时,编译器会沿着类的继承链逐级地向上查找函数的定义,如果找到了就停止查找了,所以,如果一个派生类和一个基类都存在同名(暂时不论参数是否相同)的函数,而编译器最终选择了在派生类中的函数,那么久说这个派生类的成员函数“隐藏”了基类的成员函数,也就是组织了编译器继续向上查找函数的定义。

隐藏关系:

(1)必须分别位于派生类和基类中

(2)必须同名

(3)参数不同的时候本身已经不构成覆盖关系了,所以此时是否是virtual函数已经不重要了

(4)参数相同的时候,看是否有virtual关键字,有的话就是覆盖关系,没有的时候就是隐藏关系了。

时间: 2024-11-11 03:30:28

C++:重载、覆盖与隐藏的相关文章

C++ 类函数的重载,覆盖和隐藏

覆盖(override): 覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数!函数覆盖覆盖,要满足两个条件 (1)基类中函数声明有virtual关键字 (2)基类函数和派生类的函数要函数名,参数,返回类型三者皆一致. 重载(overload):必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征 隐藏(hide): 派生类的成员函数隐藏了基类函数的成员函数.隐藏一词可以 这么理解:在调用一个类

C++之重载覆盖和隐藏

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

C++重载,覆盖和隐藏区别

a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无. 因为函数参数不同,可以简单的理解为:两个重载函数是不同的函数,调用者能够明确 的根据不同的参数来调用不同的函数.那么如果存在这样两个函数,编译器怎么处理呢? class A{public:    void Func(int a, int b=0) {printf("This is Func1/n");}    void Func(int a) {pri

c++重载、覆盖和隐藏

c++成员函数的重载.覆盖和隐藏很容易混淆,因此我们必须搞清楚这一点. 1.重载 重载特点:同一访问区域(同类).函数名称相同.函数参数不同(不关心返回类型).virtual关键字可有可无. 代码示例: class OverLoad { public: void test() {} void test(int i) {} void test(float i) {} void test(int i, float j) {} }; 2.覆盖 覆盖是指派生类函数覆盖基类函数,特点是:不同访问区域(不同

C++ 成员函数的重载与覆盖与隐藏

重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类): (2)函数名字相同: (3)参数相同: (4)基类函数必须有 virtual 关键字. 函数 Base::f(int)与 Base::f(float)相互重载,而 Base::g(void) 被 Derived::g(void)覆盖. #include <ios

C++函数的重载,覆盖和隐藏(——高质量编程)

函数重载概念 只有C++才有重载的概念,C语言没有. 靠行参列表的不同来区别不同的重载函数, 若是全局函数和成员函数同名时,不算重载,因为它们的作用域不同,所以成员函数会将全局函数给隐藏(遮蔽)了. 成员函数的重载,覆盖和隐藏 重载发生在相同的作用域中,而覆盖则发生在不同的作用域中 重载: 相同的作用域 函数的名字相同 函数的形参列表,顺序,类型,个数不同 virtual可有可无 覆盖: 作用域不同,属于不同的类中 函数的名字相同 形参列表相同 基类必须是虚函数

c/c++:重载 覆盖 隐藏 overload override overwrite

http://www.cnblogs.com/qlee/archive/2011/07/04/2097055.html 成员函数的重载.覆盖与隐藏成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防.8.2.1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类):(2)函数名

C++:类成员函数的重载、覆盖和隐藏区别?

#include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

C++重载、覆盖、隐藏的区别与举例

参考博客:http://blog.csdn.net/hexi_2000/article/details/4392107 //重载,覆盖,隐藏举例 #include <iostream> using namespace std; class A { public:     int n;     void fun()     {         cout<<"A::fun()"<<endl;     }     virtual void fun(int 

【非原创】C++类成员函数的重载、覆盖和隐藏

链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐藏区别描述正确的有? A.覆盖是指在同一个类中名字相同,参数不同 B.重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字 C.派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数 D.函数名字相同,参数相同,基类无virtual关键字的派生类的函数