C++ 多态性和重载?

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于C++ 多态性和重载?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多态性 (polymorphism)

在C++中,啥是运算符重载?啥是虚函数?

c++学习笔记:多态

如何在 C++ 中重载多态 == 和 != 运算符

Part8 多态性 8.1运算符重载

9-1:C++多态之对多态的理解和多态的实现条件以及虚函数还有重载重写冲定义的区别