浅尝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++编程》

原文地址:https://www.cnblogs.com/waiting-for/p/4332724.html