|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.12.2012, 18:49 | #1 |
Играюсь с Python
Форумчанин
Регистрация: 12.12.2012
Сообщений: 340
|
ООП на Си
ООП на обычном си без классов возможно ли (наследование, полиморфизм и другое )? И если да, то - как? Можно короткие примеры или ссылки на статьи?
|
12.12.2012, 19:18 | #2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Возможно. Первые компиляторы C++ состояли из препроцессора, переводившего код в C-код и компилятора C. Полагаю, нет вопроса, возможен ли ООП на C++.
Наследование: Код:
|
12.12.2012, 19:46 | #3 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
По сабжу: на языке си можно воссоздать все ООП механизмы. Правда делать это придется ручками, без поддержки компилятора с его технологиями. Если я не ошибаюсь, то Кармак в своей кваке именно так и поступил: реализовал технологию полиморфизма. Сам я правда приплюснутый, и сишечкой особо не заморачивался. Но заметил, что в различных холиварах пример с Кармаком часто используют защитники ООП, заявляя, что в крупной системе без ООП никуда. И если он там не поддерживается, значит велосипедируется в ручную. |
|
12.12.2012, 20:11 | #4 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Квака 3... великолепный сорс....
но дум ещё круче. Ваще да это не наследование.... наследование, это Код:
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
12.12.2012, 20:24 | #5 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
это синтаксис наследования в С++.
а не обьяснение что такое наследование. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
12.12.2012, 20:38 | #6 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Наследование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса Типы наследования Простое наследование Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза». Множественное наследование При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML. Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя. Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе. Большинство современных объектно-ориентированных языков программирования (C#, C++, Java, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков. В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом: при public-наследовании все спецификаторы остаются без изменения. при protected-наследовании все спецификаторы остаются без изменения, кроме спецификатора public, который меняется на спецификатор protected (то есть public-члены базового класса в потомках становятся protected). при private-наследовании все спецификаторы меняются на private. Одним из основных преимуществ public-наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать: A* a = new B; Эта интересная особенность открывает возможность динамической идентификации типа (RTTI). //---------- Надеюсь вопросов нет. да и пример выше...
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Последний раз редактировалось Perchik71; 12.12.2012 в 20:43. |
12.12.2012, 20:46 | #7 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
В языке с++ существует 4ре вида наследования. О трех уже было сказано выше. 4й призван решить все возможные проблемы с неоднозначностями вызовов методов. Хотя он и не является самостоятельным видом наследования, но он является одним из вариантов наследования и дополняет вышеуказанные три. Чаще всего, его приводят в качестве примера решения проблем ромбовидных иерархий: виртуальное наследование. http://ru.wikipedia.org/wiki/%C2%E8%...E2%E0%ED%E8%E5 Последний раз редактировалось _Bers; 12.12.2012 в 20:48. |
|
12.12.2012, 20:51 | #8 |
С++, Delphi
Форумчанин
Регистрация: 24.11.2012
Сообщений: 495
|
Чувак, люди опухают и с этими 3...
но спасибо я запамятовал.. надо в книгу злесть...
Если помог, тут весы есть , Вам не сложно, а мне приятно.
|
12.12.2012, 22:05 | #9 |
Играюсь с Python
Форумчанин
Регистрация: 12.12.2012
Сообщений: 340
|
Я извиняюсь, но речь я вел исключительно о СИ без классов. Спасибо всем кто прокомментировал.
Я тут кое чего написал, но не пойму почему у меня нули везде когда должны быть цифры 10 20 и 30 ? И кстати вопрос, это как-то походит на наследование в пределах обычного СИ? И еще вопрос, насколько я правильно освобождаю память? Код:
|
12.12.2012, 23:48 | #10 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
Цитата:
|
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ООП | kiss2 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 14.06.2010 13:17 |
ООП | VladimirVB | Общие вопросы Delphi | 4 | 18.11.2009 22:51 |
Паскаль ООП. Примеры программ с использованием ООП | SeЯgey | Помощь студентам | 5 | 13.05.2009 21:55 |
ООП | Andrey Gort | Общие вопросы Delphi | 1 | 22.11.2006 15:01 |