C++中重载,重写,隐藏的区别

重载:

  重载是指在同一个作用域下,函数的函数名相同,但是函数参数的个数,或者参数的类型,参数的顺序不同。这时函数之间就构成了重载关系,这里需要注意的是,如果函数的参数列表完全相同,仅仅是返回值类型不同并不能构成重载。同一个作用域又怎么理解呢?在这里主要分两种情况讨论,一种是在类外但是函数在同一个CPP文件中属于同一个作用域,另一种是在类中也属于同一个作用域。

  函数在类外,但是同在一个CPP文件

//函数在类外,但是同在一个CPP文件

#include <iostream>
using namespace std;

void test(int i)    //函数1
{
    cout << "int" << endl;
}

void test(double i)    //与函数1参数个数相同,参数类型不同,构成重载
{
    cout << "double" << endl;
}

void test(int i, int j)    //与函数1参数类型相同,但是参数个数不同,构成重载
{
    cout << "int int" << endl;
}

int test(int i)    //仅返回值类型不同,不能构成重载
{
    cout << "return int" << endl;
}

  函数在类内,这里有一种情况下也可以构成重载,函数名,参数列表完全相同,但是函数有const关键字修饰

//函数在同一个类中

#include <iostream>
using namespace std;

class A
{
public:
    A(){}
    ~A(){};

    void test(int i) //函数1
    {
        cout << "int" << endl;
    }
    void test(double i)//与函数1参数个数相同,参数类型不同,构成重载
    {
        cout << "double" << endl;
    }
    void test(int i, int j)//与函数1参数类型相同,但是参数个数不同,构成重载
    {
        cout << "int int" << endl;
    }
    void test(int i) const //与函数1参数类型参数个数相同,有const 关键字修饰,构成重载
    {
        cout << "const int" << endl;
    }
};

重写(覆盖):

  重写也叫做覆盖,发生在父类和子类中,当父类中有虚函数时,在子类中重新定义一个与父类虚函数函数名,函数参数列表一模一样的函数,并重写函数的具体实现,此种情况就构成了重写。

//重写

#include <iostream>
using namespace std;

class A
{
public:
    A(){}
    ~A(){};
    virtual void test()
    {
        cout << "A::test()" << endl;
    }
};

class B :public A
{
public:
    B(){}
    ~B(){}
    virtual void test()//virtual关键字可写可不写
    {
        cout << "B::test()" << endl;
    }
};

隐藏:

  隐藏也发生在父类和子类中,主要包含两种情况:

  1、子类和父类的函数名,参数类型完全相同,但是父类函数没有virtual关键字修饰

  2、子类和父类函数名相同,但是参数列表不同,此时不管有没有virtual关键字修饰,都能构成隐藏

//子类和父类的函数名,参数类型完全相同,但是父类函数没有virtual关键字修饰

#include <iostream>
using namespace std;

class A
{
public:
    A(){}
    ~A(){};
    void test()
    {
        cout << "A::test()" << endl;
    }
};

class B :public A
{
public:
    B(){}
    ~B(){}
    void test()
    {
        cout << "B::test()" << endl;
    }
};
//子类和父类函数名相同,但是参数列表不同,此时不管有没有virtual关键字修饰,都能构成隐藏

#include <iostream>
using namespace std;

class A
{
public:
    A(){}
    ~A(){};
    void test(int i)
    {
        cout << "A::test()" << endl;
    }
};

class B :public A
{
public:
    B(){}
    ~B(){}
    void test()
    {
        cout << "B::test()" << endl;
    }
};

//  父类的 test函数需要传入一个int类型的参数,子类的test参数不需要传入任何参数,此时若有如下语句://  B b;//  b.test(1);  //报错//  因为子类中的 void test() 函数已经把父类中的  void test(int i)  函数隐藏,这种方式下子类对象 b 并访问不到 void test(int i),此时可通过 b.A::test(1) 这种方式访问
时间: 2024-10-31 20:45:15

C++中重载,重写,隐藏的区别的相关文章

C++重载重写和多态区别

1.重载和重写的区别: 重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态. 重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态. 重定义redefining

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别

https://blog.csdn.net/ranxiaoxu123/article/details/52291385 https://www.cnblogs.com/renyuan/archive/2013/06/08/3127562.html 原文地址:https://www.cnblogs.com/Kiven5197/p/8934207.html

重载重写隐藏

1. 重载:在相同作用域中,同名函数但参数列表不同,编译器将参数列表同函数名拼接在一起形成不同的符号,所以说重载必须参数列表不同,而不考虑返回类型.C++函数重载实现原理浅析. 2. 重写:父类虚函数与子类函数同名同参数列表,则为重写. 3. 隐藏:父类非虚函数与子类函数同名时,则父类非虚函数被隐藏,即使参数列表不同.

Java中重载与复写的区别、super与this的比较

1. 方法重载与方法复写的区别 区别 方法重载 方法复写 英文单词 Overloading Override 概念 方法名称相同,参数的个数或者类型不同 方法名称相同,参数的个数和类型相同,方法的访问权限不能更严格 使用范围 发生在同一个类中 发生在继承关系中,是由子类进行复写 2.  super与this的比较 比较 super this 使用范围 是由子类访问父类中的内容 是直接访问本类中的内容 访问属性时的格式 super.父类属性, 如果属性没有被复写,则也可以不写super this.

浅尝C++中重载、隐藏和覆盖

一.重载 首先,对比C语言的函数,C++增加了重载(overloaded).内联(inline).const和virtual四种新机制,重载便是这四种新机制之一.类似自然语言,一词可以多义,在C++中,可以把语义.功能相似的几个函数用同一个名字表示,即函数重载. 重载的实现:可以通过函数的参数实现重载.注意:区分函数是否重载只能通过函数的参数而不能仅仅靠返回值.因为在C/C++中函数的返回值可以被忽略. 例如:void Function(void); int Function(void); 通过

C++中重载、重写(覆盖)和隐藏的区别实例分析

这篇文章主要介绍了C++中重载.重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念.具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 示例代码如下: class A{ public: void test(int

实例分析C++中重载、重写(覆盖)和隐藏的区别

函数重载: 在C++程序中,可以将语义.功能相似的几个函数用同一个名字表示,即函数重载. 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. class A{ public: void test(int i); void test(double i); void test(int i, double j); void test(double i, int j); int te

C++中重载、重写(覆盖)和隐藏的区别

转载自:https://blog.csdn.net/zx3517288/article/details/48976097 基本概念: 重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型. 1 class A{ 2 public: 3 void test(int i); 4 void test(double i);//overload 5 void test(int i, double j);//over

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

转载请注明,原创地址:点击打开链接   http://blog.csdn.net/u010587274/article/details/38928561 个人微信公众号:tanzi_888 (潭子技术圈) C++中成员函数的重载.覆盖和隐藏的区别: 1 重载(overload): 是函数名相同,参数列表不同 重载只是在类的内部存在.但是不能靠返回值类型来判断.1.1)相同的范围(在同一个类中)1.2)函数名字相同1.3)参数不同 1.4)Virtual关键字可有可无 2  覆盖 (overrid

重载-重写(覆盖)-隐藏的区别

重载和重写搞的差不多了,隐藏有有点混乱了,在此记一下,留作后看 成员函数被重载的特征(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.重写(覆盖)是指派生类函数覆盖基类函数,--这是c++多态的标志,虚函数赋零则变成虚基类(纯粹的接口申明类),特征是(1)不同的范围(分别位于派生类与基类):(2)函数名字相同:(3)参数相同:(4)基类函数必须有virtual 关键字.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下(1)如果派