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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.93
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

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

28.02.2013, 20:14. Просмотров 11374. Ответов 17
Метки нет (Все метки)

Вопрос дошел от знакомого, говорит услышал его на собеседовании. В с++ интерфейса как такового нет, но вопрос был задан именно по этому языку. Дайте разъяснения
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2013, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем отличается интерфейс от абстрактного класса? (C++):

Как организовать интерфейс в виде абстрактного класса? - C++
У меня есть задание, вот его часть: - расчёты движения предмета должны осуществляться в библиотеке, для которой нужно создать интерфейс...

Чем отличается шаблонный метод класса от шаблонного класса? - C++
Чем отличается шаблонный метод класса от шаблонного класса???????ПЛИЗ!!!!Если можно немного ссылок на летературу

Как обратится к обьекту класса, являющегося наследником абстрактного класса - C++
Здравствуйте! У меня есть 4 класса: один виртуальный, следующие 2 - наследуют виртуальный класс и последний класс содержит указатель на...

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

Деструктор абстрактного класса - C++
Почему деструктор абстрактного класса нужно делать виртуальным?

Объекты абстрактного класса - C++
Разбираю пример. В программе задается сразу 6 объектов. А нужно, чтобы количество объектов вводилось пользователем с клавиатуры. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
28.02.2013, 21:51 #2
Если не ошибаюсь, в С++ класс называется абстрактным, если в нем есть хотя бы один чисто виртуальный метод. Ну а интерфейс в принципе не может иметь реализацию. Таким образом, интерфейс средствами языка реализуется как абстрактный класс, все методы которого чисто виртуальные.
1
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;
}
Верно?
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
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();
};
2
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 15:05  [ТС] #5
Цитата Сообщение от HighPredator Посмотреть сообщение
class TAbstractClass
Префикс T перед AbstractClass обозначает абстрактный класс и что это за нотация где можно это прочесть?
0
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 15:11 #6
Мне кажется, за такой вопрос по голове нужно дать было. Понятие интерфейса - не ограничивается понятием класса с какими-то (описаны выше) ограничениями. В C++ есть абстрактные классы. Но нет термина интерфейс. ( и с чем сравнивать? (вопрос риторический) )

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

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

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

Не по теме:

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

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

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

Добавлено через 7 минут
Цитата Сообщение от ITcrusader Посмотреть сообщение
Такого понятия вообще не существует Можно с таким же успехом назвать класс "ну ооооочень абстрактным, абстрактнее некуда"?
Насколько я знаю, чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию. Читал это в вопросах в блоге Алены С++
0
HighPredator
5542 / 1848 / 345
Регистрация: 10.12.2010
Сообщений: 5,450
Записей в блоге: 2
01.03.2013, 15:54 #9
Цитата Сообщение от vbloodv Посмотреть сообщение
Что понимать под символом "T" вопрос открыт для меня
Я объяснил выше
Цитата Сообщение от HighPredator Посмотреть сообщение
С префикса T я обозначаю типы данных за исключением явных указателей и интерфейсов
1
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,118
01.03.2013, 16:06 #10
В С++, кажется, интерфейсов нет. А в Jave есть. Интерфейс внешне похож на абстрактный класс, но классом не является. Для абстрактного класса можно создавать классы-потомки (и, впоследствии, объекты). А интерфейс реализуется в каком-либо классе. Это несколько другой (по сравнению с наследованием) способ повторного использования кода.
1
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.03.2013, 16:08 #11
Цитата Сообщение от vbloodv Посмотреть сообщение
чисто абстрактным классом называется класс который имеет хотя бы одну чисто виртуальную функцию.
Хотя бы одну чисто виртуальную функцию имеет абстрактный класс. А как я понял - чисто абстрактный класс - это класс у которого все функции чисто виртуальные.

Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
В С++, кажется, интерфейсов нет
Правильней сказать в C++ интерфейс реализуется через абстрактный класс.
1
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
01.03.2013, 16:40  [ТС] #12
Цитата Сообщение от Catstail Посмотреть сообщение
Интерфейс внешне похож на абстрактный класс, но классом не является.
Можно ваш пример пожалуйста хотя бы псевдокод
0
ITcrusader
Эксперт C++
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.
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
01.03.2013, 17:18 #14
Цитата Сообщение от ITcrusader Посмотреть сообщение
"Чисто" - может относиться к виртуальной функции, но не классу.
Ну с точки зрения теории - да. Но на практике достаточно часто абстрактные классы, которые имеют только чисто виртуальные функции называют "чисто абстрактными классами", а также "полностью абстрактными классами", чтобы подчеркнуть, что они имеют только описание, но не имеет реализацию. На мой взгляд, эти термины достаточно удачны.
2
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
01.03.2013, 17:21 #15
StasGamilton, ну да, я в своих тут пышных постах жестко привязываюсь к терминологии Если ты говоришь чисто абстрактный класс - тебя несомненно поймет большинство коллег, с этим я не спорю)))
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 17:21
Привет! Вот еще темы с ответами:

Наследование абстрактного класса - C++
Не могли бы вы мне объяснить данный код: Actions *NewAct = new Array(); // строка 1 ((Array *)NewAct)->Set_arr(count); // строка 2 ...

Реализация абстрактного класса - C++
Создать абстрактный базовый класс Function (функция) с виртуальными методами вычисления значения функции у = f(x) в заданной точке х и...

Наследники абстрактного класса - C++
Есть классы: class A { public: virtual void met() = 0; }; class B : public A { public: virtual void met() const;

Использование абстрактного класса - C++
Доброго времени. Использую абстрактный класс Algorithm с абстрактным методом Calculate() и 5 производных от него классов, реализующих тот...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.03.2013, 17:21
Ответ Создать тему
Опции темы

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