C++中的重写、重载和隐藏
重写(override)、重载(overload)和隐藏(overwrite)在C++中是3个完全不同的概念,但是在平时的工作交流中,我发现有很多C++程序员对它们的概念模糊不清,经常误用或者混用这3个概念,所以在说明override说明符之前,我们先梳理一下三者的区别。
- 重写(override)的意思更接近覆盖,在C++中是指派生类覆盖了基类的虚函数,这里的覆盖必须满足有相同的函数签名和返回类型,也就是说有相同的函数名、形参列表以及返回类型。
- 重载(overload),它通常是指在同一个类中有两个或者两个以上函数,它们的函数名相同,但是函数签名不同,也就是说有不同的形参。这种情况在类的构造函数中最容易看到,为了让类更方便使用,我们经常会重载多个构造函数。
- 隐藏(overwrite)的概念也十分容易与上面的概念混淆。隐藏是指基类成员函数,无论它是否为虚函数,当派生类出现同名函数时,如果派生类函数签名不同于基类函数,则基类函数会被隐藏。如果派生类函数签名与基类函数相同,则需要确定基类函数是否为虚函数,如果是虚函数,则这里的概念就是重写;否则基类函数也会被隐藏。另外,如果还想使用基类函数,可以使用using关键字将其引入派生类。
重写引发的问题
在编码过程中,重写虚函数很容易出现错误,原因是C++语法对重写的要求很高,稍不注意就会无法重写