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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.81
rar14
28 / 22 / 1
Регистрация: 14.04.2009
Сообщений: 448
#1

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

02.06.2009, 14:04. Просмотров 8062. Ответов 36
Метки нет (Все метки)

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

Полиморфизм :( - C++
Всем здравствуйте. Ребят помогите пожалуйста с полиморфизмом. Я читал некоторые статьи и чем больше их читаю, тем больше возникает...

Полиморфизм - C++
Сколько я не читал книг и уроков по С++-программированию, я так и не смог понять что такое полиморфизм. Можно ли как-то просто и...

Полиморфизм. - C++
Доброго времени суток. Помогите решить следующую задачку: Создать класс периодическое издание (название, стоимость экземпляра и...

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

Полиморфизм - C++
Всем доброго времени суток, Разъясните пожалуйста задание: Создать класс живущих с местоположением . Определить наследуемые классы -...

Полиморфизм в с++ - C++
Вообщем я делал программу,изначально в ней было реализовано наследование.Затем дали задание реализовать полиморфзим для функции Scale для...

Полиморфизм - C++
Хай :senor: class MyPrint//производный класс { public: MyPrint() { cout << "Constructor MyPrint" << endl; } virtual...

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

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

Цитата Сообщение от Evg Посмотреть сообщение
Вторая вещь - это синтаксис и не более того
синтаксис есть синтаксис и его никак к полиморфизму отнести нельзя. Суть полиморфизма именно в этом предложении "Один интерфейс, множество реализаций" и он никак не должен зависеть от синтаксиса какого-то языка, исключая тот случай когда что-то не поддерживается синтаксисом самого языка
HardMorg
3 / 26 / 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 Посмотреть сообщение
немного не вовремя)
Полиморфизм-перегрузка
Это частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров, то есть не зависят от своих аргументов. Метод может не ограничиваться специфическими типами параметров многих различных типов.
перегрузка - частный случай полиморфизма. мужик правильно говорит!
programina
1914 / 599 / 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;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 13:43     Полиморфизм своими словами #21
programina, что-то интерфейса-то у Вас и нет.
Хотя бы такого:
C++
1
2
3
4
5
class sphere
{
public:
    virtual int getRadius() = 0;
};
Да и классы ничем не отличаются кроме имени.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:01     Полиморфизм своими словами #22
Цитата Сообщение от Tulosba Посмотреть сообщение
programina, что-то интерфейса-то у Вас и нет.
Хотя бы такого:
C++
1
2
3
4
5
class sphere
{
public:
    virtual int getRadius() = 0;
};
Да и классы ничем не отличаются кроме имени.
Зачем?
Здесь getRadius() и есть тот самый единый интерфейс.

Добавлено через 1 минуту
Про RTTI ничего не сказано.

Добавлено через 2 минуты
Ой!

Добавлено через 3 минуты
Про наследование ничего не сказано
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 14:14     Полиморфизм своими словами #23
Цитата Сообщение от programina Посмотреть сообщение
Зачем?
Затем чтобы можно было использовать разнотипные объекты, реализующие интерфейс. В Вашем, например, случае нельзя SUN и EARTH добавить в единый контейнер (не прибегая к каким-нибудь хакам с void*).
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
#include <iostream>
 
using namespace std;
 
 
class sphere
{
public:
    virtual int getRadius() = 0;
};
 
class Sun : public sphere
{
public:
    int getRadius() { return 1000; }
};
 
class Earth : public sphere
{
public:
    int getRadius() { return 1; }
};
 
int main() {
 
    
    sphere* sp[] = { new Sun(), new Earth() };
    
    for( int i=0; i<sizeof(sp)/sizeof(*sp); ++i )
    {
        cout << sp[i]->getRadius() << endl;
        
    }
    return 0;
}
https://ideone.com/Ah4jfV

Пример кривоват, но суть показывает.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
06.05.2013, 14:20     Полиморфизм своими словами #24
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Tulosba, Это динамический полиморфизм, да.
Есть так же статический

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
#include <iostream>
 
template<typename Strategy>
struct Interface
{
public:
   void call()
   {
      Strategy().call();
   }
};
 
struct Flyable
{
public:
   void call()
   {
      std::cout << "flyable" << std::endl;
   }
};
 
struct Reachable
{
public:
   void call()
   {
      std::cout << "reachable" << std::endl;
   }
};
 
int main()
{
   Interface<Flyable>().call();
   Interface<Reachable>().call();
}
http://ideone.com/VbaSoY
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 14:25     Полиморфизм своими словами #25
Цитата Сообщение от ForEveR Посмотреть сообщение
Есть так же статический
Согласен.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:25     Полиморфизм своими словами #26
ForEveR, struct это тот же class, только c public-внутреннестями?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 14:26     Полиморфизм своими словами #27
Цитата Сообщение от programina Посмотреть сообщение
struct это тот же class, только c public-внутреннестями?
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:31     Полиморфизм своими словами #28
Цитата Сообщение от Tulosba Посмотреть сообщение
да. Так что можно было упростить и не только внутренностями. При наследовании тоже по умолчанию используется public.
То есть public можно убрать из примера Forever ?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
06.05.2013, 14:32     Полиморфизм своими словами #29
programina, Можно. А это столь критично?)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 14:37     Полиморфизм своими словами
Еще ссылки по теме:

Полиморфизм - C++
Здравствуйте :) Я пытался читать про полиморфизм. Читал-читал, но не очень дошло. Понял, что можно переопределить виртуальную функцию...

Полиморфизм - C++
Вот сделал прогу а ее надо было сделать полиморфизмом - кому несложно переделайте #include &lt;iostream.h&gt; #include &lt;conio.h&gt; ...

Полиморфизм - C++
В одной дешевой книжке про него пишут а в другой дорогой нет и понять я почему то немогу точно как и для чего он нужен

С++ и полиморфизм - C++
Здравствуйте. Ответьте пожалуйста на несколько вопросов: 1. Что такое абстрактная функция простыми словами? 2. Что такое...

полиморфизм=( - C++
Ув.Знатаки Доброго времени суток!Вот есть проблемка с написание полиморфизма,вот написал класс,написал наследование,а вот как теперь сюда...


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

Или воспользуйтесь поиском по форуму:
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
06.05.2013, 14:37     Полиморфизм своими словами #30
для меня все критично потому что я ООП учу
Yandex
Объявления
06.05.2013, 14:37     Полиморфизм своими словами
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru