C ++多态和重载?

时间:2016-08-25 22:10:05

标签: c++ polymorphism overloading

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

2 个答案:

答案 0 :(得分:7)

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

术语覆盖用于提供虚拟函数的派生类特定实现。从某种意义上说,它是一种替代品。相反,重载只是为函数名提供了一个附加含义。

动态多态性的例子:

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(); }

注意:
¹除非它影响基类提供的含义。 功能

答案 1 :(得分:2)

是的,重载是一种静态多态, Ad hoc多态是准确的。

它不是动态多态(Subtyping),这是人们通常在C ++的上下文中引用的。

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