【问题标题】:C++ polymorphism and overloading?C++ 多态性和重载?
【发布时间】:2017-01-02 11:44:59
【问题描述】:

可以将重载视为多态的实现吗?如果它们相同,那么为什么使用两个不同的词?

【问题讨论】:

  • 重载与虚函数和继承无关。您可以重载同一类中的方法。因此有 2 个不同的词。
  • 覆盖和重载是两个完全不同的东西。你问的是覆盖吗?
  • 是的,重载是静态(编译时)多态性的一种形式。然而,在 C++ 中,“多态类”这一表述是指具有至少一个虚成员函数的类。即,在 C++ 中,该术语与动态多态性密切相关

标签: c++ polymorphism overloading


【解决方案1】:

是的,重载是静态多态性(编译时多态性)的一种形式。但是,在 C++ 中,“多态类”这一表述是指具有至少一个虚成员函数的类。即,在 C++ 中,术语“多态”与动态多态性密切相关。

override 一词用于提供特定于派生类的虚函数实现。从某种意义上说,它是一种替代品。相比之下,重载只是为函数名称提供了 ¹附加含义。

动态多态示例:

struct Animal
{
    virtual auto sound() const
        -> char const* = 0;
};

struct Dog: Animal
{
    auto sound() const
        -> char const* override
    { return "Woof!"; }
};

#include <iostream>
using namespace std;

auto main()
    -> int
{
    Animal&& a = Dog();
    cout << a.sound() << endl;
}

静态多态示例:

#include <iostream>
using namespace std;

template< class Derived >
struct Animal
{
    void make_sound() const
    {
        auto self = *static_cast<Derived const*>( this );
        std::cout << self.sound() << endl;
    }
};

struct Dog: Animal< Dog >
{
    auto sound() const -> char const* { return "Woof!"; }
};

auto main()
    -> int
{ Dog().make_sound(); }

注意事项:
¹ 除非它掩盖了基类提供的含义。

【讨论】:

    【解决方案2】:

    是的,重载是静态多态的一种形式,准确地说是即席多态

    这不是人们通常在 C++ 上下文中所指的动态多态性(子类型化)。

    https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 2011-10-15
      • 2011-06-25
      • 2011-06-22
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多