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

Чем отличается интерфейс от абстрактного класса? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.93
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
28.02.2013, 20:14     Чем отличается интерфейс от абстрактного класса? #1
Вопрос дошел от знакомого, говорит услышал его на собеседовании. В с++ интерфейса как такового нет, но вопрос был задан именно по этому языку. Дайте разъяснения
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
28.02.2013, 21:51     Чем отличается интерфейс от абстрактного класса? #2
Если не ошибаюсь, в С++ класс называется абстрактным, если в нем есть хотя бы один чисто виртуальный метод. Ну а интерфейс в принципе не может иметь реализацию. Таким образом, интерфейс средствами языка реализуется как абстрактный класс, все методы которого чисто виртуальные.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 14:16  [ТС]     Чем отличается интерфейс от абстрактного класса? #3
Спасибо, за ответ. Могу попросить еще один пример что-то вроде:
C++
1
2
3
4
5
class Foo // абстрактный класс
{
 virtual Draw(){} = 0;
// присутствуют другие методы и конст. дестр по умолчанию
}
C++
1
2
3
4
5
6
7
class Shape // интерфейс
{
virtual Draw() {} = 0;
virtual Shape() {} = 0;
virtual ~Shape() {} = 0;
virtual Release() {} = 0;
}
Верно?
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
01.03.2013, 14:45     Чем отличается интерфейс от абстрактного класса? #4
vbloodv, с точки зрения ООП, интерфейс - это чисто абстрактный класс. В свою очередь, чисто абстрактный класс - абстрактный класс, не содержащий данных и определенных методов. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//интерфейс
class ICustom
{
public:
  virtual void DoSomething()=0;
  virtual ~ICustom();
};
 
//абстрактный класс
class TAbstractClass
{
private:
  bool State;
public:
  virtual void DoSomething()=0;
  bool GetState();
  virtual ~TAbstractClass();
};
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 15:05  [ТС]     Чем отличается интерфейс от абстрактного класса? #5
Цитата Сообщение от HighPredator Посмотреть сообщение
class TAbstractClass
Префикс T перед AbstractClass обозначает абстрактный класс и что это за нотация где можно это прочесть?
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 15:11     Чем отличается интерфейс от абстрактного класса? #6
Мне кажется, за такой вопрос по голове нужно дать было. Понятие интерфейса - не ограничивается понятием класса с какими-то (описаны выше) ограничениями. В C++ есть абстрактные классы. Но нет термина интерфейс. ( и с чем сравнивать? (вопрос риторический) )

Добавлено через 2 минуты
Цитата Сообщение от vbloodv Посмотреть сообщение
Префикс T перед AbstractClass обозначает абстрактный класс и что это за нотация где можно это прочесть?
Едва ли Т здесь означает абстрактный. С I - все понятно. А остальные классы лучше не предварять ничем, ибо, как ты только что убедился, нотаций 10000000000, и такой префикс больше вопросов вызывает. В отличие от I, к которому привыкли.

Добавлено через 3 минуты
Цитата Сообщение от HighPredator Посмотреть сообщение
чисто абстрактный класс
Такого понятия вообще не существует Можно с таким же успехом назвать класс "ну ооооочень абстрактным, абстрактнее некуда"?
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
01.03.2013, 15:17     Чем отличается интерфейс от абстрактного класса? #7
ITcrusader, это не термин языка. Это термин в рамках концепции объектно-ориентированного программирования. Так что вопрос вполне корректный.

Добавлено через 51 секунду

Не по теме:

С префикса T я обозначаю типы данных за исключением явных указателей и интерфейсов

vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 15:42  [ТС]     Чем отличается интерфейс от абстрактного класса? #8
Цитата Сообщение от HighPredator Посмотреть сообщение
ITcrusader, это не термин языка. Это термин в рамках концепции объектно-ориентированного программирования. Так что вопрос вполне корректный.
Извиняюсь, наверное это я ввел в заблуждение вас сказал что это в рамках языка! Что понимать под символом "T" вопрос открыт для меня я не понимаю?

Цитата Сообщение от ITcrusader Посмотреть сообщение
(вопрос риторический)
Напоминает мне вопрос о том какой объект может иметь sizeof == 0;

Добавлено через 7 минут
Цитата Сообщение от ITcrusader Посмотреть сообщение
Такого понятия вообще не существует Можно с таким же успехом назвать класс "ну ооооочень абстрактным, абстрактнее некуда"?
Насколько я знаю, чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию. Читал это в вопросах в блоге Алены С++
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
01.03.2013, 15:54     Чем отличается интерфейс от абстрактного класса? #9
Цитата Сообщение от vbloodv Посмотреть сообщение
Что понимать под символом "T" вопрос открыт для меня
Я объяснил выше
Цитата Сообщение от HighPredator Посмотреть сообщение
С префикса T я обозначаю типы данных за исключением явных указателей и интерфейсов
Catstail
Модератор
 Аватар для Catstail
21492 / 10245 / 1670
Регистрация: 12.02.2012
Сообщений: 17,129
01.03.2013, 16:06     Чем отличается интерфейс от абстрактного класса? #10
В С++, кажется, интерфейсов нет. А в Jave есть. Интерфейс внешне похож на абстрактный класс, но классом не является. Для абстрактного класса можно создавать классы-потомки (и, впоследствии, объекты). А интерфейс реализуется в каком-либо классе. Это несколько другой (по сравнению с наследованием) способ повторного использования кода.
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.03.2013, 16:08     Чем отличается интерфейс от абстрактного класса? #11
Цитата Сообщение от vbloodv Посмотреть сообщение
чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию.
Хотя бы одну чисто виртуальную функцию имеет абстрактный класс. А как я понял - чисто абстрактный класс - это класс у которого все функции чисто виртуальные.

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
В С++, кажется, интерфейсов нет
Правильней сказать в C++ интерфейс реализуется через абстрактный класс.
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 16:40  [ТС]     Чем отличается интерфейс от абстрактного класса? #12
Цитата Сообщение от Catstail Посмотреть сообщение
Интерфейс внешне похож на абстрактный класс, но классом не является.
Можно ваш пример пожалуйста хотя бы псевдокод
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:01     Чем отличается интерфейс от абстрактного класса? #13
Цитата Сообщение от vbloodv Посмотреть сообщение
Напоминает мне вопрос о том какой объект может иметь sizeof == 0;
Это вполне нормальный вопрос. Ответ на него обозначен в стандарте.

Цитата Сообщение от vbloodv Посмотреть сообщение
Насколько я знаю, чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию. Читал это в вопросах в блоге Алены С++
"Чисто" - может относиться к виртуальной функции, но не классу. Класс, будь в нем 1, 2, ...50 чисто виртуальных функций не становится называется "абстрактным", НЕ более того, в независимости от того, есть ли в нем еще и обычные функции или нет. Кем-то придуманное выражение "чисто виртуальный класс", в C++ своего отражения
не находит. Почему я об этом пишу и придираюсь к словам? Да потому что на собеседованиях иногда странные вопросы задают.


An abstract class is a class that is designed to be specifically used as a base class. An abstract class contains at least one pure virtual function. You declare a pure virtual function by using a pure specifier (= 0) in the declaration of a virtual member function in the class declaration.
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.03.2013, 17:18     Чем отличается интерфейс от абстрактного класса? #14
Цитата Сообщение от ITcrusader Посмотреть сообщение
"Чисто" - может относиться к виртуальной функции, но не классу.
Ну с точки зрения теории - да. Но на практике достаточно часто абстрактные классы, которые имеют только чисто виртуальные функции называют "чисто абстрактными классами", а также "полностью абстрактными классами", чтобы подчеркнуть, что они имеют только описание, но не имеет реализацию. На мой взгляд, эти термины достаточно удачны.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:21     Чем отличается интерфейс от абстрактного класса? #15
StasGamilton, ну да, я в своих тут пышных постах жестко привязываюсь к терминологии Если ты говоришь чисто абстрактный класс - тебя несомненно поймет большинство коллег, с этим я не спорю)))
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
01.03.2013, 19:20     Чем отличается интерфейс от абстрактного класса? #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вырезка:
C++ поддерживает множественное наследование и абстрактные классы, поэтому, как уже упоминалось выше, отдельная синтаксическая конструкция для интерфейсов в этом языке не нужна. Интерфейсы определяются при помощи абстрактных классов, а реализация интерфейса производится путём наследования этих классов. Благодаря наличию множественного наследования, ничто не мешает реализовать в одном классе несколько интерфейсов, если в этом есть необходимость
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.03.2013, 19:24     Чем отличается интерфейс от абстрактного класса? #17
Кстати чисто абстрактный класс используется не только в русскоязыных источниках. Пример на WikiBooks
Интересно, что этот термин употребляет и Липпман:
http://msdn.microsoft.com/en-us/magazine/cc163516.aspx]MSDN Magazine.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2013, 02:10     Чем отличается интерфейс от абстрактного класса?
Еще ссылки по теме:

Деструктор абстрактного класса C++
C++ Использование абстрактного класса
Объекты абстрактного класса C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
02.03.2013, 02:10     Чем отличается интерфейс от абстрактного класса? #18
Касательно Java: (полезно знать как это в других ОО языках, т.к. понятия и термины часто путаются и заимствуются)
Абстрактные классы используются только тогда, когда есть "is a" тип отношений; интерфейсы могут быть реализованы классами которые не связаны друг с другом.
Абстрактный класс может реализовывать методы; интерфейс не может реализовывать методы.
Интерфейс может только описывать константы и методы, но не реализовывать их. Все методы интерфейса по-умолчанию являются публичными (public) и абстрактными (abstract), а поля - public static final.
В Java класс может наследоваться (реализовывать) от многих интерфейсов, но только от одного абстрактного класса.
С абстрактными классами вы теряете индивидуальность класса, наследующего его; с интерфейсами вы просто расширяете функциональность каждого класса.

Если друг шел в кампанию, где слушал его Java-прогер (например когда требуют знания C++/Java) то он хотел бы услышать именно это. А т.к. языки имеют схожие концепции, то могут ошибочно полагать, что у них все, что связано с объектами реализовано одинаково или понятия существуют один в один. Думаю, с вашим другом как раз оное и было (попался на человека, который прогает на Java), либо не смог внятно объяснить что к чему, на таком тоже ловят.
Yandex
Объявления
02.03.2013, 02:10     Чем отличается интерфейс от абстрактного класса?
Ответ Создать тему
Опции темы

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