2016-08-25 2 views
-2

Может ли перегрузка рассматриваться как реализация полиморфизма? Если они одинаковы, то почему используются два разных слова?Полиморфизм и перегрузка C++?

+0

Перегрузка не имеет ничего общего с виртуальными функциями и наследованием. Вы можете перегружать методы в одном классе. следовательно, 2 разных слова. –

+0

Переопределение и перегрузка - две совершенно разные вещи. Вы спрашиваете об переопределении? –

+1

Да, перегрузка - это форма статического (компиляционного) полиморфизма. Однако в C++ выражение «полиморфный класс» относится к классу с хотя бы одной виртуальной функцией-членом. I.e., в C++, этот термин сильно связан с динамическим полиморфизмом –

ответ

5

Да, перегрузка является формой статического полиморфизма (время компиляции полиморфизм). Однако в C++ выражение “ полиморфный класс ” относится к классу с по меньшей мере одной виртуальной функцией-членом. I.e., в 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

Да, перегрузка является формой статического полиморфизма, Ad hoc полиморфизм, если быть точным.

Это не динамический полиморфизм (подтипирование), к которому обычно относятся люди в контексте C++.

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

Смежные вопросы