zoukankan      html  css  js  c++  java
  • 浅尝C++中重载、隐藏和覆盖

    一、重载

      首先,对比C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制,重载便是这四种新机制之一。类似自然语言,一词可以多义,在C++中,可以把语义、功能相似的几个函数用同一个名字表示,即函数重载。

      重载的实现:可以通过函数的参数实现重载。注意:区分函数是否重载只能通过函数的参数而不能仅仅靠返回值。因为在C/C++中函数的返回值可以被忽略。

      例如:void Function(void);

         int Function(void);

         通过int x = Function();

         这里即无法判断到底调用了哪个函数。

      注意:并不是函数名相同就构成了重载,全局函数和类成员函数的同名就不算重载,因为函数的作用域不同。

      如:void Print(...);

        class A

        {

          void Print(...);

        }

        函数的重载还应该注意的是发生隐式类型转换而导致二义性的产生。如下代码

    #include<iostream>
    using namespace std;
    
    void output( int x); // 函数声明
    void output( float x); // 函数声明
    
    void output( int x)
    {
        cout << " output int " << x << endl ;
    }
    void output( float x)
    {
        cout << " output float " << x << endl ;
    }
    
    void main(void)
    {
        int x = 1;
        float y = 1.0;
        output(x); // output int 1
        output(y); // output float 1
        output(1); // output int 1
        output(0.5); // error! ambiguous call, 因为自动类型转换
        output(int(0.5)); // output int 0
        output(float(0.5)); // output float 0.5
    }
    View Code

    二、覆盖

      覆盖是指派生类函数覆盖基类函数,特征是:

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

      2、函数的名字相同;

      3、参数相同;

      4、基类函数必须有Virtual关键字

    三、隐藏

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

      1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。(易与重载混淆)

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

    更多实例详见《高质量C++编程》

  • 相关阅读:
    ABAP学习(10):ALV显示之function alv
    ABAP学习(11):ALV显示之OO ALV使用示例
    ABAP学习(3):屏幕显示
    ABAP学习(6):ABAP GUI和开发工具
    ABAP学习(9):时间日期操作
    ABAP学习(8):操作EXCEL
    ABAP学习(2):控制语句
    ABAP学习(5):数据库语句
    ABAP学习(4):内表
    编程经验:高性能.NET WEB开发(1)http压缩
  • 原文地址:https://www.cnblogs.com/waiting-for/p/4332724.html
Copyright © 2011-2022 走看看