C++多态和重载?
C++ polymorphism and overloading?
重载可以看作是多态的一种实现吗?如果它们相同,那么为什么使用两个不同的词?
是的,重载是静态多态的一种形式,Ad hoc 多态 准确地说。
它不是动态多态(子类型),这是人们通常在 C++ 上下文中提到的。
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
是的,重载是静态多态(编译时多态)的一种形式。但是,在 C++ 中,表达式“多态 class”指的是具有至少一个虚成员函数的 class。也就是说,在 C++ 中,术语“多态”与 动态多态性.
密切相关
术语覆盖 用于提供派生的class 虚函数的特定实现。从某种意义上说,它是一种替代。相比之下,重载 只是为函数名称提供了一个额外的含义。
动态多态的例子:
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(); }
备注:
¹ 除非它掩盖了基数 class 提供的含义。
重载可以看作是多态的一种实现吗?如果它们相同,那么为什么使用两个不同的词?
是的,重载是静态多态的一种形式,Ad hoc 多态 准确地说。
它不是动态多态(子类型),这是人们通常在 C++ 上下文中提到的。
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
是的,重载是静态多态(编译时多态)的一种形式。但是,在 C++ 中,表达式“多态 class”指的是具有至少一个虚成员函数的 class。也就是说,在 C++ 中,术语“多态”与 动态多态性.
密切相关术语覆盖 用于提供派生的class 虚函数的特定实现。从某种意义上说,它是一种替代。相比之下,重载 只是为函数名称提供了一个额外的含义。
动态多态的例子:
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(); }
备注:
¹ 除非它掩盖了基数 class 提供的含义。