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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ c++ http://www.cyberforum.ru/cpp-beginners/thread37851.html
Что значит строки v_arr(arr, N); w_arr(arr, N);
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); bool my (int i,int j) { return (i<j); } http://www.cyberforum.ru/cpp-beginners/thread37844.html
C++ Генератор случайных чисел в интервале (0;10)
Как сгенерировать случайную последовательность целых чисел лежащих в интервале то 0 до 10? Т.е. как задать границы для генерации ПСЧ.
ListView C++ C++
Пожалуйста!! Очень надо! С помощью ListView написать программу игры в шашки. Заранее спасибо
C++ найти ошибку http://www.cyberforum.ru/cpp-beginners/thread37817.html
Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале , а потом все остальные. # include <stdio.h> # include <conio.h> # include <stdlib.h> # include <math.h> # include <iostream.h> void main() {
C++ Как в функцию передать параметр - двухмерный массив void max_el() { int i,j,max; for ( i=1 ; i<=n; i++) for ( j=1; j<=m; j++) //nahodim maksimalnii element if (max<a) { max=a; max_str=i; }; printf("Max element = %3d in Str %2d \n \n",max,max_str); for ( j=1 ; j<=m; j++) printf("%3d ",a); подробнее

Показать сообщение отдельно
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6237 / 2966 / 289
Регистрация: 04.12.2011
Сообщений: 7,918
Записей в блоге: 3
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;//нормально для указателя на С-строку
Не бесспорное резюме. Полиморфизм, это возможность кода менять поведение, без явного применения операторов ветвления в данной точке. Баги, тоже подходят под это определение.
Под классическое тоже, - наиболее эффективные, реализуют один и тот же интерфейс, что и правильный код.
 
Текущее время: 18:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru