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++ 多态性和重载?的主要内容,如果未能解决你的问题,请参考以下文章