C++知识点之函数重载

重载机制是C++编译时多态的表现形式之一,具体表现为函数名称相同但是传入的参数不同,编译器根据具体的参数执行相应的函数。如果传入非常量或者指向非常量的指针,重载的函数都能调用,但是对于编译器优先选择非const版本传入常量或指向常量的指针时,只能选择const版本。特别的,当函数里面有同名函数时候函数外部的函数会被隐藏。我们在使用函数重载的时候要特别注意,必须要把需要重载的函数的声明写在一起在同一个作用域中,要么都在全局,要么都在局部,要是在不同作用域就不会发生重载。

1:重载与作用域

先看看正常的重载是怎么实现的

```

void  print(const string& str);

void  print(int val);

void  print(double val);//三个重载函数的声明

void  print(const string& str)

{

    cout<<str<<endl;

}

void print(int val)

{

    cout<<val<<endl;

}

void print(double val)

{

    cout<<val<<endl;

}

int main(void) 

   print("qwer");

   print(1);

   print(2.3);

```

如果我们用一个在函数里面声明新的函数去屏蔽原有的函数,例如

```

int main(void) 

   void print(int a);

   print("qwer");

   print(1);

   print(2.3);

```

在函数里面新声明的函数会屏蔽掉传入string 参数的函数,会提示无法将string 类型转换为int 类型的错误。必须指出,在函数里面声明新的函数是非常不明智的做法,必须丢到这种习惯。

2:继承中的重载

```

class A

{

public:

    A(){}

    virtual ~A(){}

    void print(string& str)

    {

        cout<<str<<endl;

    }

};

class B:A

{

public:

    B(){}

    ~B(){}

    void print(int a)

    {

        cout<<a<<endl;

    }

    void test()

    {

        string a="123";

        print(a);

    }

};

```

可以看到,在基类和派生类中定义两个参数不同的函数时候,基类中的重载函数将会被屏蔽。如果加上虚函数,那就是常见的运行时多态了。所以结论是,重载必须发生在同一个作用域中否则就会覆盖或者屏蔽。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容