c++ - 函数覆盖有哪些用例?
问题描述
我正在回顾一些 c++ 概念(我几年前使用过),现在函数重载的概念对我来说很有意义,尤其是对于我在去年的 powershell 编程经验中遇到的一些场景。例如,现在我可以很容易地向某人解释它对于软件重构、使代码可读性更容易等非常有用……
我不明白的是功能覆盖的用法/好处。它有什么好的用例?从研究中,我刚刚读到它用于对父类中的子类函数具有不同的行为,但是,您不能只是将子类中的函数命名为其他名称,然后直接以这种方式调用它而不用担心父类类函数?
解决方案
你不能把子类中的函数命名为别的,然后直接调用它而不用担心父类函数吗?
不,因为不可能拥有作为多态性的全部基础的运行时动态调度。
(动态调度是在 C++(和大多数其他语言)中使用基于 vtable 的 ( virtual
) 调用实现的)。其他语言如 Objective-C 和 Smalltalk 使用消息传递范式。用 C 编写的程序必须自己实现 vtable 调用或消息传递(例如通过使用函数指针)。
考虑这个伪代码 [3] 示例:
class AnyCat {
abstract void MakeSound();
}
class HouseCat extends AnyCat {
override void MakeSound() {
Console.WriteLine( "Meow" );
}
}
class Lion extends AnyCat {
override void MakeSound() {
Console.WriteLine( "Roar" );
}
}
static void Main() {
AnyCat cat = GetRandomNumber() % 2 == 0 ? new HouseCat() : new Lion();
cat.MakeSound(); // <-- this is a vtable/virtual-call
}
因为cat
可能是 HouseCat
或者Lion
在运行时,编译器(以及程序员!)不能使用“静态调用”[4] 到MakeSound
.
[3] 我没有使用 C++ 的class
声明语法,因为它太冗长,而且因为 C++ 目前不需要使用说明override
符,所以当方法声明将导致 vtable 调用或者它只是一个阴影。
[4] 在这种情况下,“静态调用”是指一般意义上的“静态编译”或“在编译时固定”(例如“静态类型”)。它与 OOP 编程语言中的static
关键字或static
-methods 无关(尽管有趣的事实:对static
方法的所有调用都是静态调用)。
推荐阅读
- python - 使用 pandas 在 Python 中有条件地对 DataFrame 进行分组
- c - 指针的数组表示法
- amazon-web-services - 具有管理策略的 AWS 用户被 CLI 命令拒绝
- google-bigquery - BigQuery:发生内部错误,无法完成请求。错误:7367027
- c++ - constexpr std::string_view::find_last_of 不适用于带有 libstdc++ 9 的 clang 8
- python - 如何计算单词出现次数而不限于仅精确匹配
- android - 如何从主要配置文件中的应用获取我的工作配置文件应用的启动意图?
- android - 在android studio中升级数据库不起作用
- python - 是否可以在中间件中访问会话(来自 aiohttp_session)?
- vue.js - vue模板中如何分配一个字符串和一个字符串?