Форум программистов, компьютерный форум CyberForum.ru

Полиморфизм своими словами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.81
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 14:04     Полиморфизм своими словами #1
Дайте определения полиморфизма своими слова. А так же примерчик, который ярко выражает полиморфизм.
Спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 14:04     Полиморфизм своими словами
Посмотрите здесь:

C++ Полиморфизм
C++ полиморфизм
C++ Полиморфизм
Полиморфизм C++
C++ Полиморфизм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sergei
 Аватар для Sergei
1421 / 688 / 40
Регистрация: 22.04.2008
Сообщений: 1,608
02.06.2009, 14:13     Полиморфизм своими словами #2
Полиморфизм это когда наследуемые классы или просто различные классы имеют
одинаковые методы но с различной реализацией
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
02.06.2009, 14:51     Полиморфизм своими словами #3
И не обязательно классы, можно и просто функции.

C
1
2
void func (int x) { }
void func (float x) { }
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 14:54  [ТС]     Полиморфизм своими словами #4
То есть полиморфизм в общем виде - это перегрузка функций (методов)?
GalaX
 Аватар для GalaX
696 / 568 / 21
Регистрация: 18.11.2008
Сообщений: 2,152
02.06.2009, 15:08     Полиморфизм своими словами #5
Цитата Сообщение от rar14 Посмотреть сообщение
То есть полиморфизм в общем виде - это перегрузка функций (методов)?
примерно, только перегрузка - это когда класс имеет два (и более) метода с одинаковыми именами, а полиморфизм - в каждом классе свой метод, но называется также.. например:
PHP
1
2
3
4
5
6
class самолет {
  function move();
}
class танк {
  function move();
}
два класса с одинаковыми методами (названиями), но у этих методов разная реализация - в классе "самолет" этот метод реализует движение по воздуху, а в классе "танк" в методе с таким же названием реализуется движение по земле
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
02.06.2009, 15:12  [ТС]     Полиморфизм своими словами #6
Вроде о полиморфизме можно говорить, когда есть наследование? У вас там нет наследования.
И еще. Методы обязательно должны быть объявлены с спецификатором virtual для того, чтобы быть полиморфными?
GalaX
 Аватар для GalaX
696 / 568 / 21
Регистрация: 18.11.2008
Сообщений: 2,152
02.06.2009, 15:40     Полиморфизм своими словами #7
Цитата Сообщение от rar14 Посмотреть сообщение
Вроде о полиморфизме можно говорить, когда есть наследование? У вас там нет наследования.
не обязательно наследование применять, но если погонять мыслЮ, то можно увидеть че такое полиморфизм (с наследованием):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class техника {
    function go() {
        $this->move();
    }
}
class самолет extends техника {
    function move() {
        print 'Летим на самолете';
    }
}
class танк extends техника {
    function move() {
        print 'Катимся на танке';
    }
}
$plane = new самолет;
$tank = new танк;
 
$plane->go(); // Выведет "Летим на самолете"
$tank->go(); // думаю не трудно догадаться что выведет тут
в Cpp у меня мозг не форцает, поэтому написал на php
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
02.06.2009, 15:50     Полиморфизм своими словами #8
rar14,
Дайте определения полиморфизма своими слова
единообразная работа с разными по своей природе сущностями.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
02.06.2009, 16:02     Полиморфизм своими словами #9
Цитата Сообщение от Evg Посмотреть сообщение
И не обязательно классы, можно и просто функции.

C
1
2
void func (int x) { }
void func (float x) { }
Значит я ошибся в терминологии. А то, что написал я, как называется? Перегрузка функций?
Sergei
 Аватар для Sergei
1421 / 688 / 40
Регистрация: 22.04.2008
Сообщений: 1,608
02.06.2009, 16:23     Полиморфизм своими словами #10
Evg ты ошибся это перегрузка функции а не полиморфизм
Полиморфизм относится к ООП а не к функциям в отдельности

Добавлено через 3 минуты 31 секунду
Полиморфи́зм (в языках программирования) — взаимозаменяемость объектов с одинаковым интерфейсом.

Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования [1].

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием).

Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение. Внешне общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (типами аргументов и результатов). Внутренняя общность есть одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (функций, операций).
GalaX
 Аватар для GalaX
696 / 568 / 21
Регистрация: 18.11.2008
Сообщений: 2,152
02.06.2009, 16:24     Полиморфизм своими словами #11
Цитата Сообщение от Sergei Посмотреть сообщение
Полиморфизм относится к ООП а не к функциям в отдельности
Evg вот в этом ошибся, а насчет того что перегрузка функций относится к полиморфизму в этом нет никакой ошибки, т.к. перегрузка функций это один из способов реализации полиморфизма
Sergei
 Аватар для Sergei
1421 / 688 / 40
Регистрация: 22.04.2008
Сообщений: 1,608
02.06.2009, 16:28     Полиморфизм своими словами #12
Мой Вам простой совет чтобы понять что такое полиморфизм и вообщее ООП
напишите какую нибудь программу например работа с 2-х мерными геометрическими фигурами и только тогда вы сможете понять что такое ООП и наследование полиморфизм и все что с этим связано иначе по теории программирование трудно изучить надо писать программы и как можно больше.

Добавлено через 1 минуту 39 секунд
Evg вот в этом ошибся, а насчет того что перегрузка функций относится к полиморфизму в этом нет никакой ошибки, т.к. перегрузка функций это один из способов реализации полиморфизма
Тогда надо уточнить какие еще есть способы полиморфизма?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
02.06.2009, 16:44     Полиморфизм своими словами #13
Цитата Сообщение от GаlаX Посмотреть сообщение
Evg вот в этом ошибся, а насчет того что перегрузка функций относится к полиморфизму в этом нет никакой ошибки, т.к. перегрузка функций это один из способов реализации полиморфизма
Если термином полиморфизм и вправду называют то, что написал Sergei, то перегрузка функций к полиморфизму не относится, ибо при перегрузке у тебя может и количество праметров изменяться. Т.е. это противоречит

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».
GalaX
 Аватар для GalaX
696 / 568 / 21
Регистрация: 18.11.2008
Сообщений: 2,152
02.06.2009, 18:57     Полиморфизм своими словами #14
Цитата Сообщение от Evg Посмотреть сообщение
...то перегрузка функций к полиморфизму не относится, ибо при перегрузке у тебя может и количество праметров изменяться...
в том то и суть что кол-во/тип параметров меняется, а название метода то же самое остается , думаю поэтому перегрузку к полиморфизму и относят

Цитата Сообщение от Sergei Посмотреть сообщение
Тогда надо уточнить какие еще есть способы полиморфизма?
я вроде больше не слышал про другие способы, но и утверждать что других способов НЕТ небуду
но самое главное запомнить фразу: "Один интерфейс, множество реализаций" - на этом полиморфизм и строится
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16833 / 5254 / 323
Регистрация: 30.03.2009
Сообщений: 14,145
Записей в блоге: 26
02.06.2009, 20:28     Полиморфизм своими словами #15
Цитата Сообщение от GаlаX Посмотреть сообщение
в том то и суть что кол-во/тип параметров меняется, а название метода то же самое остается
Вот в том-то и дело, что МЕТОДА, т.е. часть реализации класса, а не висячая в воздухе процедура. Т.е. у тебя есть РАЗНЫЕ КЛАССЫ, но эти классы предоставляют один и тот же метод с одним и тем же интерфейсом

Цитата Сообщение от GаlаX Посмотреть сообщение
думаю поэтому перегрузку к полиморфизму и относят
В терминологии, теории, философии я не силён. Просто тот механизм, по которому работают виртуальные методы (фактически каждый класс выполняет собственную реализацию) тот механизм, когда функция вызывается с одним и тем же именем, но разными параметрами - это две принципиально разные вещи. Вторая вещь - это синтаксис и не более того
GalaX
 Аватар для GalaX
696 / 568 / 21
Регистрация: 18.11.2008
Сообщений: 2,152
03.06.2009, 10:28     Полиморфизм своими словами #16
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. у тебя есть РАЗНЫЕ КЛАССЫ, но эти классы предоставляют один и тот же метод с одним и тем же интерфейсом
вот, это один из способов полиморфизма, а перегрузка уже другой

Цитата Сообщение от Evg Посмотреть сообщение
Просто тот механизм, по которому работают виртуальные методы (фактически каждый класс выполняет собственную реализацию) тот механизм, когда функция вызывается с одним и тем же именем, но разными параметрами - это две принципиально разные вещи.
ну конечно разные, поэтому это и есть два разных способа реализации полиморфизма, т.е. , можно сказать, один реализуется через наследование, а другой через перегрузку. Причем оба способа можно объеденить. Либо чего-то может и не быть

Цитата Сообщение от Evg Посмотреть сообщение
Вторая вещь - это синтаксис и не более того
синтаксис есть синтаксис и его никак к полиморфизму отнести нельзя. Суть полиморфизма именно в этом предложении "Один интерфейс, множество реализаций" и он никак не должен зависеть от синтаксиса какого-то языка, исключая тот случай когда что-то не поддерживается синтаксисом самого языка
HardMorg
2 / 25 / 3
Регистрация: 29.08.2010
Сообщений: 204
17.07.2012, 00:44     Полиморфизм своими словами #17
немного не вовремя)
Полиморфизм-перегрузка
Это частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров, то есть не зависят от своих аргументов. Метод может не ограничиваться специфическими типами параметров многих различных типов.
_SOKOL_
1 / 1 / 0
Регистрация: 09.02.2013
Сообщений: 15
06.05.2013, 11:39     Полиморфизм своими словами #18
Перегрузка - это функции с одним именем которые принимают разные аргументы, это никак не полиморфизм, тут спорить не о чем.
Полиморфизм - один и тот же метод с одинаковыми параметрами и разными реализациями, возможен только в ООП.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;
 
class vehicle
{
public:
    vehicle(void) {}
    virtual ~vehicle() = 0; // у чисто виртуального деструктора обязательно должна быть реализация
 
    virtual void move() {} /* Виртуальный метод, у таких методов в родительских классах как этот обязательно должна быть пустая реализация и реализация в дочерних классах. В противном случае выйдут ошибки: LNK2001 и LNK1120 */
};
vehicle::~vehicle() {}
 
 
// Наследуемые классы
class tank : public vehicle
{
public:
    tank(void) {}
    ~tank(void) {}
    void move() { cout << "Tank moving\n"; } /* Вот опять же, на всякий случай напомню, что перегрузка это функции с одним именем которые принимают разные аргументы, здесь же у нас тот же метод что у родителя с теме же параметрами но иной реализацией, это полиморфизм */
};
 
 
class truck : public vehicle
{
public:
    truck(void) {}
    ~truck(void) {}
    void move() { cout << "Truck moving\n"; }
};
 
 
// Точка входа
int main()
{
    // Первый вариант полиморфизма
    vehicle *Vehicle[2];
    Vehicle[0] = new truck[5];
    Vehicle[1] = new tank[2];
    Vehicle[0][3].move();   //  на выводе Truck moving
    Vehicle[1][1].move();   //  на выводе Tank moving
 
    // Второй вариант
    vehicle **Vehicle2;
    Vehicle2 = new vehicle*[2];
    Vehicle2[0] = new truck[4];
    Vehicle2[1] = new tank[3];
    Vehicle[0][1].move();   //  на выводе Truck moving
    Vehicle[1][1].move();   //  на выводе Tank moving
 
    return 0;
}
По правде такой код у меня не работает) необходимо по человечески разбить классы на файлы

Добавлено через 5 минут
vehicle.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
 
#include <iostream>
using namespace std;
 
class vehicle
{
public:
    vehicle(void);
    virtual ~vehicle(void) = 0;
 
    virtual void move(); /* Виртуальный метод, у таких методов в родительских классах как этот обязательно должна быть пустая реализация и реализация в дочерних классах. В противном случае выйдут ошибки: LNK2001 и LNK1120 */
};

vehicle.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "vehicle.h"
 
 
vehicle::vehicle(void)
{
}
 
 
vehicle::~vehicle(void)
{
}
 
 
void vehicle::move()
{
 
}

tank.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
#include "vehicle.h"
 
class tank : public vehicle
{
public:
    tank(void);
    ~tank(void);
    void move(); /* Вот опять же, на всякий случай напомню, что перегрузка это функции с одним именем которые принимают разные аргументы, здесь же у нас тот же метод что у родителя с теме же параметрами но иной реализацией */
};

tank.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "tank.h"
 
 
tank::tank(void)
{
}
 
 
tank::~tank(void)
{
}
 
 
void tank::move()
{
    cout << "Tank moving\n";
}

truck.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
#include "vehicle.h"
 
class truck : public vehicle
{
public:
    truck(void);
    ~truck(void);
    void move();
};

truck.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "truck.h"
 
 
truck::truck(void)
{
}
 
 
truck::~truck(void)
{
}
 
 
void truck::move()
{
    cout << "Truck moving\n";
}

header.h
C++
1
2
#include "tank.h"
#include "truck.h"

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "header.h"
 
int main()
{
    // Первый вариант полиморфизма
    vehicle *Vehicle[2];
    Vehicle[0] = new truck[5];
    Vehicle[1] = new tank[2];
    Vehicle[0][3].move();   //  на выводе Truck moving
    Vehicle[1][1].move();   //  на выводе Tank moving
 
    // Второй вариант
    vehicle **Vehicle2;
    Vehicle2 = new vehicle*[2];
    Vehicle2[0] = new truck[4];
    Vehicle2[1] = new tank[3];
    Vehicle[0][1].move();   //  на выводе Truck moving
    Vehicle[1][1].move();   //  на выводе Tank moving
 
    return 0;
}
Miwa123
37 / 37 / 1
Регистрация: 16.04.2013
Сообщений: 317
Записей в блоге: 1
06.05.2013, 11:47     Полиморфизм своими словами #19
Цитата Сообщение от HardMorg Посмотреть сообщение
немного не вовремя)
Полиморфизм-перегрузка
Это частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров, то есть не зависят от своих аргументов. Метод может не ограничиваться специфическими типами параметров многих различных типов.
перегрузка - частный случай полиморфизма. мужик правильно говорит!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 13:30     Полиморфизм своими словами
Еще ссылки по теме:

C++ Полиморфизм
Полиморфизм C++
C++ Полиморфизм в с++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 13:30     Полиморфизм своими словами #20
Один интерфейс, множество реализаций.

Добавлено через 29 минут
C++
#include <iostream>
using namespace std;
 
class SUN
{
    int radius;
public:
    SUN(int radius)
    {
        this->radius = radius;
    }
 
    int getRadius() { return radius; }
};
 
class EARTH
{
    int radius;
public:
    EARTH(int radius)
    {
        this->radius = radius;
    }
 
    int getRadius() { return radius; }
};
 
SUN::SUN(1000);
EARTH::EARTH(1);
 
int main()
{
    SUN sun;
    EARTH earth;
 
    cout << "Радиус Солнца: " << sun.getRadius() << endl;
    cout << "Радиус Земли: " << earth.getRadius() << endl;
 
    return 0;
}
Yandex
Объявления
06.05.2013, 13:30     Полиморфизм своими словами
Ответ Создать тему
Опции темы

Текущее время: 06:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru