C++:overload, override和overwrite

Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

Override(覆盖):是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。

Overwrite(重写):是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

[特别注意]

如果基类有某个函数的多个重载(overload)版本,而你在子类中重写(overwrite)了其中的一个,或是子类添加新的函数版本,则所有基类的重载版本都被遮蔽。所以,正常情况下,在子类中应重写基类中的所有重载版本。

具体地讲,继承类中的重载和重写都包含了重写的涵义,即只要函数名一样,基类的函数版本就会被遮蔽,所以,在派生类中要保持基类的重载版本,就应该重写所有基类的重载版本。重载只在当前类中有效,继承会失去重载的特性。也就是说,把基类的重载函数放在继承类里,就必须重写。


转自:http://blog.youkuaiyun.com/colinchan/archive/2009/08/27/4489073.aspx

<think>我们正在查找关于C++中std::overload的头文件信息。根据提供的引用,我们注意到在引用[1]中有一个示例使用了std::visit一个名为overload的结构。但是,请注意,在C++标准库中,并没有一个直接名为std::overload的类型。引用[1]中定义了一个名为overload的模板结构,这是一个自定义的类,用于实现多lambda重载。同样,在引用[3]中提到了boost::hana::overload_linearly,这是Boost库中的工具。因此,我们可以推断:1.在C++17中,标准库并没有提供std::overload。2.用户可能在查找如何实现多lambda重载,而引用[1]中的overload是一个自定义的帮助类,用于实现这个功能(通过继承多个lambda并引入它们的operator(),然后使用usingTs::operator()...来避免歧义)。如果用户想要使用类似的功能,在C++17中需要自己定义(如引用[1]所示)或者使用第三方库(如Boost.Hana)。所以,回答用户的问题:C++标准库中并没有std::overload,因此没有对应的头文件。但是,如果用户需要自定义的overload实现(如引用[1]所示),那么代码中已经给出了定义,用户可以直接复制该定义。另外,注意在引用[3]中提到了Boost.Hana库,其中有一个boost::hana::overload_linearly,它的头文件应该是Boost.Hana库的头文件,例如<boost/hana/functional/overload_linearly.hpp>。因此,总结如下:1.如果用户想要使用标准库中的类似功能,目前C++17标准中没有std::overload。2.如果用户需要自定义,则按照引用[1]的方式定义即可,无需特定头文件。3.如果用户愿意使用Boost库,可以使用Boost.Hana中的overload_linearly。由于用户明确询问的是std::overload,因此我们只能遗憾地告诉用户,标准库中没有这个组件。下面按照用户要求,生成相关问题。</think> 在 C++ 标准库中,**不存在名为 `std::overload` 的组件**,因此没有对应的标准头文件。您可能在文档或示例中看到的 `overload` 通常属于以下两种情况: ### 1. 自定义工具类(如引用[1]示例) 示例代码中的 `overload` 是一个自定义模板类,用于实现**多函数对象重载**: ```cpp template<typename... Ts> struct overload : Ts... { using Ts::operator()...; }; ``` 此代码直接写在需要使用的源文件中(如引用[1]的示例所示),无需特定头文件。 ### 2. Boost 库实现(如引用[3]) Boost.Hana 库提供类似功能 `boost::hana::overload_linearly`: ```cpp #include <boost/hana/functional/overload_linearly.hpp> ``` 需安装 Boost 库并通过此头文件引入。 ### 替代方案建议 若需类似功能,推荐以下两种方式: 1. **自定义实现**:直接在代码中声明上述模板类(无需额外依赖) 2. **标准库 `std::variant` + `std::visit`**(需要 C++17): ```cpp #include <variant> #include <iostream> int main() { std::variant<int, std::string> data = "hello"; std::visit([](auto&& arg) { if constexpr (std::is_same_v<decltype(arg), int>) std::cout << "int: " << arg; else if constexpr (std::is_same_v<decltype(arg), std::string>) std::cout << "string: " << arg; }, data); } ``` [^1]: 参考自定义 `overload` 实现示例 [^3]: Boost.Hana 的重载工具文档 --- ### 相关问题 1. `std::visit` 如何处理包含多种类型的 `std::variant`? 2. 如何在 C++17 中实现类型安全的访问者模式? 3. Boost.Hana 库的 `overload_linearly` 与自定义 `overload` 类有何性能差异? 4. `std::variant` 传统虚函数多态在内存布局上有何本质区别?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值