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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ c++ http://www.cyberforum.ru/cpp-beginners/thread37851.html
Что значит строки v_arr(arr, N); w_arr(arr, N);
C++ Вывести на экран "уникальные" элементы массива 1 Есть массив, вывести на экран все элементы, которые встречаются хотя-бы дважды 2 Вывести на экран "уникальные" элементы. ЗЫ использовать только <iostream> http://www.cyberforum.ru/cpp-beginners/thread37848.html
C++ Проблемы с sort()
В #include "stdafx.h" #include <iostream> #include <ctime> #include <algorithm> using namespace std; void out(int *a,int n,int k); void vin(int *a,int n); void copt(int *a,int n,int k);...
C++ Генератор случайных чисел в интервале (0;10)
Как сгенерировать случайную последовательность целых чисел лежащих в интервале то 0 до 10? Т.е. как задать границы для генерации ПСЧ.
C++ ListView C++ http://www.cyberforum.ru/cpp-beginners/thread37823.html
Пожалуйста!! Очень надо! С помощью ListView написать программу игры в шашки. Заранее спасибо
C++ найти ошибку Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале , а потом все остальные. # include <stdio.h> # include <conio.h> # include... подробнее

Показать сообщение отдельно
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
10.05.2013, 23:58
Оговоюсь сразу, что С++ знаю очень поверхностно и рискую высказаться, т.к. сам не уверен в том, что правильно понимаю вопрос. Полиморфизм, это конечно "один интерфейс - много методов", но как указывают многие авторы, нет возможностей ООП, воплощённых в виде классов, которые нельзя было бы реализовать в модульном, процедурном коде.
μορφή — форма, то есть полиморфизм - способность менять форму.
Мои наблюдения говорят о том, что полиморфизм в С++, реализуется за счет полиморфизма, заложенного в природу указателя как такового, и/или за счёт возможности контроля типов во время выполнения. При этом выяснение фактического типа, позволяет выяснить поведение кода, без явного применения логических операторов и операторов ветвления в точке изменчивости.
Можно изменить поведение кода, явно применив логическую операцию к значению переменной:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main(){
int a=1, b=1;
cout<<"enter a ";cin>>a;
if(a!=b)goto two;
one:
cout<<"one\n";system("pause");exit(0);
two:
cout<<"two\n"; 
system("pause");
return 0;   
}
Однако требуется явное применения операторов ветвления.
Возможность создавать сложные пользовательские типы, позволяет ветвить код не применяя такие операторы явно, но при этом тип используется как переменная для принятия решения:
C++
1
2
3
4
5
6
7
class Abase a{/**/};
class inhAb  b:Abase{/**/};
class inhAc  c:Abase{/**/};
//где-то в коде, тем не менее, логически предопределено, как проинициализируется указатель базового класса:
Abase *a=inhAb();
//или
Abase *a=inhAс();
Зато далее, достаточно сложная, различная логика, реализуемая наследниками никак не отразится в коде. Можно создавать коллекции базового типа, смешивая в них экземпляры наследников и итерировать указателем на базовый класс, вызывая лексически одни и те же методы.
Перегрузка функций, за счёт применения разнотипных аргументов, может вызывать изменчивость, проявляемую на стадии выполнения в точке вызова. При этом, переадресация происходит за счёт использования того или иного значения указателя на функцию, в зависимости от типов аргументов. То есть идея та же, вроде.
Я рискну сказать, что полиморфизм это способность программы изменять поведения в зависимости от того, на что конкретно указывает определённый указатель во время выполнения. Тем не менее, отсутствие опыта не даёт мне примеров, когда сама инициализация такого указателя не задана явной логикой.
Напоследок шутка, демонстрирующая факт, что указатель на тип не является законченным типом и поведение кода зависит от того, на что он в действительности указывает.
"Чары С" в С++:
C++
1
2
3
4
5
6
7
8
char a='a';
char* pa=&a;//указатель на char
char* pb="abcdef";//и это указатель на char
cout<<*pa<<endl;//а
cout<<*pb<<endl;//а
if(*pa==*pb)cout<<"*pa = *pb"<<endl;//эта операция определена для char
//cout<<pa<<endl;//не определено для любого указателя на char
cout<<pb<<endl;//нормально для указателя на С-строку
Не бесспорное резюме. Полиморфизм, это возможность кода менять поведение, без явного применения операторов ветвления в данной точке. Баги, тоже подходят под это определение.
Под классическое тоже, - наиболее эффективные, реализуют один и тот же интерфейс, что и правильный код.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru