`
YuHuang.Neil
  • 浏览: 189269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的重载、覆盖和隐藏的区分

 
阅读更多
今天看书遇到了C++中比较难缠的概念,就是重载、覆盖和隐藏。如果只要区分重载和覆盖,相信应该没有什么难度,并且它们的界限还是比较清晰的。现在加上了隐藏,初次看这些概念还真是不好区分。下面总结一下它们之间的区别:

成员函数的重载的特征有以下4点:
(1) 必需在相同的范围内,即在同一个类的内部;
(2) 函数名称相同;
(3) 函数的参数不相同;
(4) virtual关键字可选,即可以加上也可以不加上,不影响重载的发生。

覆盖是指派生类函数覆盖基类函数,它的特征有以下4点:
(1)必需在不同的范围中,即分别在派生类和基类中;
(2) 函数名称相同;
(3) 参数也必需相同;
(4) 基类函数必需有virtual关键字。

而隐藏行为则必需符合以下两条规则:
(1) 如果派生类的函数与基类的函数的名称相同,但是参数不同。此时,不管有无virtual关键字,基类的函数都会被派生类的同名函数隐藏;
(2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。这个时候基类的同名函数也会被隐藏。

下面Demo说明了覆盖和隐藏之间的区别

覆盖例子:

#include <iostream>
#include <cstdlib>

using namespace std;

class a
{
  public :
         void virtual hello()
         {
              cout<<"a hello()"<<endl;     
         }    
         
         void hello(int i)
         {
              cout<<"a.hello(i)"<<i<<endl;     
         }
         
         
};

class b: public a
{
  public:
         void hello() 
         {
              cout<<"b hello()"<<endl;    
         }   
         void hello(int i) const
         {
              cout<<"b.hello(i)"<<i<<endl;     
         } 
};

int main(int argc,char * args[])
{
    {
         a *aptr=new b;
         aptr->hello();
         
         b* bptr=new b;
         bptr->hello();
         
         delete aptr;
         delete bptr;
    }
    
    system("pause");
    return EXIT_SUCCESS;    
}




上面的例子是覆盖,由于基类a中和派生类b中的hello函数的签名完全相同,而且基类a中有virtual关键字,所以基类a中的hello函数被派生类b中的hello函数所覆盖,因此具有多态的特性(只有覆盖才具有多态的特征)。

这段代码显示的结果为:


稍微改动上述代码,得到下面的例子:

#include <iostream>
#include <cstdlib>

using namespace std;

class a
{
  public :
         void hello()
         {
              cout<<"a hello()"<<endl;     
         }    
         
         void hello(int i)
         {
              cout<<"a.hello(i)"<<i<<endl;     
         }
         
         
};

class b: public a
{
  public:
         void hello() const 
         {
              cout<<"b hello()"<<endl;    
         }   
         void hello(int i) const
         {
              cout<<"b.hello(i)"<<i<<endl;     
         } 
};

int main(int argc,char * args[])
{
    {
         a *aptr=new b;
         aptr->hello();
         
         b* bptr=new b;
         bptr->hello();
         
         delete aptr;
         delete bptr;
    }
    
    system("pause");
    return EXIT_SUCCESS;    
}



改动后代码运行的结果是:


  • 大小: 16.3 KB
  • 大小: 17.4 KB
分享到:
评论

相关推荐

    重载、覆盖和隐藏

    ### 重载、覆盖和隐藏:面向对象编程中的三大概念 在面向对象编程中,类成员函数的重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个非常重要的概念,它们帮助程序员更好地管理和扩展代码。下面将...

    C++中的重载丶重写丶重定义丶重定向的区别.docx

    C++ 中的函数重载、重写、重定义和重定向是四个常见的概念,但它们之间存在一定的区别和联系。下面我们将详细地讨论每个概念。 一、函数重载 函数重载是指在同一个类中定义多个同名的函数,但是这些函数的参数不同...

    C++概念重载、覆盖、隐藏的使用说明

    在C++编程语言中,重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个重要的概念,它们都是多态性(Polymorphism)的体现,但有着不同的特性和用途。以下是对这三个概念的详细说明: **函数重载...

    C++ 重写重载重定义区别

    ### C++ 中重写、重载与重定义的区别 在 C++ 编程语言中,重写(Override)、重载(Overload)以及重定义(Redefine 或 Hide)是面向对象编程中非常重要的概念。这三个概念虽然在字面上相似,但它们在实际应用中的...

    浅谈C++重载、重写、重定义

    在C++编程语言中,重载、重写和重定义是三个重要的概念,它们涉及到函数的多态性和作用域。下面将详细讲解这三个概念,并通过示例代码进行说明。 1. 重载(Overload) 重载是指在同一个作用域内,可以定义多个同名...

    C++基类指针和派生类指针之间的转换方法讲解

    函数隐藏和函数覆盖只会发生在基类和派生类之间。 函数隐藏是指派生类中函数与基类中的函数同名,但是这个函数在基类中并没有被定义为虚函数,这种情况就是函数的隐藏。 所谓隐藏是指使用常规的调用方法,派生类对象...

    C++中的类 个人总结

    在C++编程语言中,类(Class)是构建复杂数据结构和实现面向对象编程的核心概念。下面将详细解释这些知识点: 1. 结构体(Struct):C++扩展了C语言的结构体,允许结构体包含函数,这使得结构体在C++中更接近类的...

    c++面试300题(华为,易思博,中软)

    30. 重载、覆盖和隐藏:重载在同一作用域内,不同参数列表的同名函数;覆盖发生在派生类中,相同名称和参数列表,但必须是`virtual`;隐藏是基类同名成员在派生类中被新的声明隐藏。 以上是C++面试中涉及的一些核心...

    C++编程指南

    除了基础编程技巧,文档还涉及了C++的高级特性,如函数重载、成员函数的重载、覆盖与隐藏、参数的缺省值、运算符重载以及函数内联。这些高级特性是C++语言区别于其他语言的核心,灵活运用这些特性可以编写出更加优雅...

    C,C++ in 5 days

    - **C与C++混合编程**:讨论了如何在同一项目中结合使用C和C++代码。 - **运算符重载**:介绍了如何为现有类型定义新的运算符行为。 - **内存管理**:讲解了手动管理内存的方法,包括动态分配和释放。 - **多重继承*...

    C++面试题合集

    - **Struct vs Class**:在 C++ 中,`struct` 和 `class` 本质上非常相似,它们都可以用来定义类,并且都可以包含数据成员和成员函数。两者的主要区别在于默认的访问控制级别不同: - `struct` 默认成员为 `public`...

    高质量C++编程指南-林锐

    第八章介绍了C++函数的高级特性,比如函数重载、成员函数的重载、覆盖与隐藏、参数的缺省值、运算符重载以及函数内联。这些都是C++相较于其他编程语言所特有的高级特性,能够帮助开发人员更高效地编写代码。 第九章...

    c++ 300题经典

    面试中,C++的题目通常涉及其核心概念和技术,包括类、对象、面向对象编程思想、内存管理、构造函数、拷贝构造函数、析构函数、运算符重载、多态性、友元和访问控制等。 1. 面向对象的程序设计思想强调数据和操作...

    高质量C/C++编程指南

    这部分内容探讨了C++特有的高级功能,如函数重载、成员函数的重载与覆盖、运算符重载等,以及如何利用这些特性来提高代码的灵活性和复用性。 - **函数重载**:通过函数名相同而参数列表不同来实现多态。 - **成员...

    林锐-高质量c/c++编程指南

    8. **C++函数高级特性**:介绍函数重载、成员函数的重载、覆盖与隐藏、参数缺省值、运算符重载、函数内联等概念及其应用。 9. **类的构造函数、析构函数与赋值函数**:深入讲解构造函数与析构函数的起源、构造函数...

    面试经典——高质量C++编程

    - **成员函数的重载、覆盖与隐藏**:明确这些概念的区别及其应用场景。 - **运算符重载**:掌握运算符重载的规则,使其更加符合直觉。 - **函数内联**:了解内联函数的优点和缺点,合理使用以提高性能。 #### 九、...

Global site tag (gtag.js) - Google Analytics