首页 > 解决方案 > 函数覆盖有哪些用例?

问题描述

我正在回顾一些 c++ 概念(我几年前使用过),现在函数重载的概念对我来说很有意义,尤其是对于我在去年的 powershell 编程经验中遇到的一些场景。例如,现在我可以很容易地向某人解释它对于软件重构、使代码可读性更容易等非常有用……

我不明白的是功能覆盖的用法/好处。它有什么好的用例?从研究中,我刚刚读到它用于对父类中的子类函数具有不同的行为,但是,您不能只是将子类中的函数命名为其他名称,然后直接以这种方式调用它而不用担心父类类函数?

标签: c++

解决方案


你不能把子类中的函数命名为别的,然后直接调用它而不用担心父类函数吗?

不,因为不可能拥有作为多态性的全部基础的运行时动态调度。

(动态调度是在 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方法的所有调用都是静态调用)。


推荐阅读