Вопросы на собеседовании
PHP
C++ (ООП)
Базы данных
.NET
Некоторые распространенные вопросы на собеседовании для C++ программиста:
Что такое класс? Что такое объект? В чем разница?
Какие существуют модификаторы уровня доступа?
Что такое наследование?
Если мы наследуем класс, наследуются ли приватные поля (члены)?
Что означает модификатор virtual?
Что такое абстрактный класс. Можно ли создать экземпляр абстрактного класса?
Что такое инкапсуляция?
Что такое полиморфизм. Какими средствами языка он реализуется?
Что такое виртуальный деструктор?
Что такое виртуальный конструктор?
Оставить комментарий
Что такое ООП?
Что такое класс? Что такое объект? В чем разница?
Какие существуют модификаторы уровня доступа?
Что такое наследование?
Если мы наследуем класс, наследуются ли приватные поля (члены)?
Что означает модификатор virtual?
Приведем пример:
Пусть имеется базовый класс base, от которого наследуется производный класс derived
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class base { public: void func(void) { cout << "Вызван метод базового класса base\n"; return; } }; class derived: public base { public: void func(void) { cout << "Вызван метод производного класса derived\n"; return; } }; |
Теперь посмотрим на следующий код:
base *p; // объявляем указатель на базовый класс base derived d_ob; p=&d_ob; //указателю присваиваем адрес объекта производного класса derived p->func(); //вызываем метод
В результате выполнения кода получим:
Вызван метод базового класса base
Здесь мы присвоили указателю адрес объекта производного класса, но при вызове метода func выполняется код из метода базового класса base. Если же мы объявим в базовом классе виртуальный метод, то компилятор во время выполнения вызовет метод адресуемого объекта.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class base { public: virtual void func(void) { cout << "Вызван метод базового класса base\n"; return; } }; class derived: public base { public: void func(void) { cout << "Вызван метод производного класса derived\n"; return; } }; |
Теперь в результате выполнения кода получим:
Вызван метод производного класса derived
Что такое абстрактный класс. Можно ли создать экземпляр абстрактного класса?
Что такое инкапсуляция?
Что такое полиморфизм. Какими средствами языка он реализуется?
Что такое виртуальный деструктор?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class base { public: ~base() { cout << "Вызван деструктор базового класса base\n"; } }; class derived: public base { public: ~derived() { cout << "Вызван деструктор производного класса derived\n"; } }; |
Теперь, выполним следующий код:
1 2 3 4 5 | base *p; // объявляем указатель на базовый класс base derived d_ob; p=new derived(); // присваиваем указателю адрес объекта производного объекта derived delete p; // удаляем объект, на который ссылается указатель return 0; |
Что такое виртуальный конструктор?
|
0 | Tweet | Нравится |
|
На этот раздел с вопросами оставлено 32 комментария
-
falko
20 Июнь 2010 12:02:23 (ссылка)>Если мы наследуем класс, наследуются ли приватные поля (члены)?
>Нет, приватные (private) поля доступны для использования только внутри класса.
Да, наследуются, но не доступны в методах класса наследника.
-
spike
29 Август 2010 14:22:45 (ссылка)Вы уверены в этом? Просто где ни читал везде пишут что нет=(
В общем случае получаем один и тот же смысл, в обоих случаю использовать члены нельзя, но все-же хотелось бы конкретики! Пожалуйста выложите сайт(укажите книгу) откуда такие сведения?) Заранее спасибо! -
serj
05 Октябрь 2010 20:44:32 (ссылка)А зачем вам где-то читать об этом? Что означает слово "наследуется"? Если оно означает, что поле присутствует физически внутри объекта, занимает память, инициализируется при помощи конструктора и удаляется деструктором, то наследуются все поля, включая приватные. А если под "наследуется" подразумевается именно доступность поля в коде, тогда не наследуется. На мой взгляд правильней первый вариант.
-
Tiger
05 Октябрь 2010 21:15:45 (ссылка)Я думаю, человека интересует мнение, так сказать, первоисточников.
На ваш взгляд правильным является первый вариант, другой посчитает правильным второй.Возникает вопрос: кто прав?
-
Арсений
30 Май 2011 03:19:44 (ссылка)Наследуются но не доступны пойдет? Для доступности внутри наследования придумали модификатор protected...
-
Tiger
30 Май 2011 09:13:24 (ссылка)Не знаю, смысл все равно один и тот же, как не назови, потому что, говоря о модификаторах доступа, интересует прежде всего доступность свойства.
-
Dron
16 Май 2013 13:34:56 (ссылка)Наследуются в физическом понимании этого и доступны через методы базового класса.
И когда сомневаетесь в чем-то не нужно городить огороды теоретических войн. Нужен один практический пример-доказательство.class a
{
public:
a() {nCallsCount = 0;}inline void foo1() { nCallsCount++; }
inline int GetFoo1CallsCount() { return nCallsCount; }private:
int m_nFoo1CallsCount;
};class b : public a
{
public:
b():a() {}
};int _tmain(int argc, _TCHAR* argv[])
{
b childObject;childObject.foo1();
childObject.foo1();
childObject.foo1();cout
-
-
zzz
03 Февраль 2011 15:33:03 (ссылка)попробуйте наследовать класс с mutable member и получите точный ответ.
-
wh
04 Июнь 2011 08:28:03 (ссылка)читайте спецификацию, там ясно сказано НЕ НАСЛЕДУЮТСЯ, а в книгах можно много всякого бреда прочесть. Вон какой спор подняли из за элементарных вещей
-
Сергей
12 Октябрь 2011 01:04:29 (ссылка)У меня на собеседовании такой ответ не будет засчитан.
Вопрос имеет подвох, хоть его автор, наверняка, этого не заметил. Понимание сути происходящего - необходимое требование к любому низкоуровневому программисту.
---
1) Модификаторы доступа модифицируют доступ. Наследуется все, кроме переопределенных виртуальных методов.
2) Приватные данные базового класса не доступны на прямую в наследнике, но доступны через открытые и защищенные методы базового класса. Более того, через public методы они могут быть доступны и всем окружающим. Дальше можно не продолжать.
Можно трактовать спецификацию как угодно, но главное - понимание сути. А суть такова, что данные базового класса так или иначе присутствуют в производном, не зависимо от модификатора доступа и наследования.
99% всего ОО Проектирования вертится вокруг того, что производный класс(при открытом наследовании) одновременно является и базовым.
Пишу исключительно, чтобы осветить тему. Никакого негатива.
---
Системный архитектор, Москва -
Deimos
23 Июнь 2010 10:09:29 (ссылка)Сколько лишних и бестолковых слов...
Объектно-ориентированное программирование — это новый подход к созданию программ. ООП использует лучшие идеи, воплощенные в структурном программировании, и сочетает их с мощными новыми концепциями, которые позволяют оптимально организовывать ваши программы.
Из 30 слов здесь воды - как минимум штук 10.
Далее, полимирфизм - это куда более широкое понятие, чем та трактовка, которая используется в ООП (www.rsdn.ru)
-
admin
23 Июнь 2010 15:19:48 (ссылка)Это всего лишь краткие ответы на вопросы, которые задают на собеседовании. Они служат для того, чтобы человек вспомнил, что вообще говорить по данному вопросу, развил то, что написано.
Про ООП можно написать объемную статью. И где здесь в ответе на вопрос Вы видите воду?
>полимирфизм - это куда более широкое понятие, чем та трактовка, которая используется в ООП
Эмм... А какой еще полиморфизм Вы имеете ввиду? Здесь выложены вопросы по ООП, логично предположить, что полиморфизм будет рассматриваться именно с этой стороны.
-
Deimos
23 Июнь 2010 17:40:34 (ссылка)Да, после повторного прочтения статьи с учётом комментария соглашусь, что статья - больше пометки на полях, притом скорее для впервые ищущего работу. Хотя, честно говоря, сегодня про ООП чаще спрашивают всё же в контексте других языков. Полная ссылка на статью почему-то была сгрызена, когда я оставлял комментарий.
-
admin
23 Июнь 2010 18:19:55 (ссылка)Насчет того, что это для тех, кто впервые ищет работу - позволю не согласиться. Такие вопросы задают, даже, если у соискателя опыт более 5 лет. Знаю лично по себе. Это некая шпаргалка, которую удалось составить, благодаря опыту людей, проходивших собеседование по C++.
Собраны самые частые вопросы, которые встречаются почти везде.
>> Хотя, честно говоря, сегодня про ООП чаще спрашивают всё же в контексте других языков.
Не только. Часто просят рассказать просто про саму парадигму ООП.
-
Студент-программист
30 Май 2011 03:23:43 (ссылка)admin> "Часто просят рассказать просто про саму парадигму ООП."
Хм. Как студент не совсем компетентен, но разве ООП не состоит из парадигм(тех трех)? -
admin
30 Май 2011 10:05:33 (ссылка)Все верно, здесь имеется ввиду, что часто просят рассказать про ооп в общем, без привязки к конкретному языку.
-
RDS
17 Январь 2011 18:30:16 (ссылка)Вот хорошая книга по ООП, там рассказывается и про простой и про сложный полиморфизм - Г.С.Иванова, Т.Н.Ничушкина, Е.К.Пугачев Объектно-ореинтированое программирование. После прочтения этой книги, многое встанет на свои места, и в дальнейшем легче станет изучать и понимать ОО-языки
-
sasha84
17 Январь 2011 20:30:16 (ссылка)Я начинал знакомство с ООП по книге Г. Шилдта "Самоучитель C++". На мой взгляд, идеальная книга для начинающих, которые хотят освоить ООП.
-
RDS
18 Январь 2011 10:07:54 (ссылка)Может быть, не читал её, но много слышал о ней! Надо почитать, интересно! Но вот С++ язучал по книге "С++ во всей полноте" Уолтер Савич, мне понравилось))))
-
Ищу работу
30 Май 2011 03:26:00 (ссылка)Шилдт очень хорош, но полезен для совсем еще новеньких, которые только на ноги встают. Если уже есть определенные представления - советую читать Страуструпа "Язык программирования С++"
-
dskut
25 Январь 2011 16:37:54 (ссылка)Похоже, опечатка во втором примере про виртуальные методы. В результате выполнения кода мы получим
Вызван метод производного класса derived
-
admin
25 Январь 2011 18:01:01 (ссылка)Да, действительно, опечатка была.
Спасибо, что заметили, поправили.
-
ПростоЗамечание
24 Март 2012 19:23:00 (ссылка)"Объектно-ориентированное программирование — это новый подход к созданию программ" уж не знаю в каком году статью писали - но ООП - НОВЫЙ подход - это оригинально. Сколько же еще времени должно пройти, чтобы он перестал быть новым
-
Laja
15 Сентябрь 2012 18:54:19 (ссылка)Нужно обращать внимание на оформление курсов и как их представляют.
"Лучший видео курс... принципиально новая система" - это все слова дилетантов. Не советую этот курс (читайте Страуструпа,Эккеля или Липмана(попроще Страуструпа)). Автору советую хоть немного по программировать на C++, чтобы понять что за лажу он пишет. -
Вячеслав
23 Октябрь 2013 18:04:04 (ссылка)Полиморфизм - позднее связывание. То есть свзязывание на этапе выполнения программы
-
Вась
15 Май 2015 15:20:17 (ссылка)Позднее связывание - механизм реализации полиморфизма в языках программирования. С его помощью можно реализовать и другие вещи.
-
Вячеслав
23 Октябрь 2013 18:07:34 (ссылка)Полиморфизм - позднее связывание. Связывание на этапе выполнения программы.
Еще полиморфизм от слова, которое обозначает возможность принятия многих форм. Дословано "Полиморфизм" - "Многообразность" -
Вась
15 Май 2015 15:07:52 (ссылка)"Компилятор во время выполнения" - это как "с в последствии покойным Берлиозом". Во время выполнения нет компилятора, но есть райнтайм, т.е. среда выполнения С++, которая реализует механизмы, специфичные для языка С++, вызов виртуальных функций производится именно средой выполнения.
-
Вась
15 Май 2015 15:17:30 (ссылка)"ООП - это новый подход к созданию программ" и т.д. - не более чем рекламные лозунги 20-летней давности. ООП - это подход к созданию программ, при котором данные и код группируются в рамках так называемых классов, что позволяет снизить связность кода и улучшить его поддерживаемость, а также повторную используемость. ООП позволяет эффективно бороться со сложностью кода, так как разбиение на классы делает программу в высокой степени модульной. Математическое представление объектно-ориентированной программы - множество объектов обменивающихся сообщениями, которые меняют состояние этих объектов. Из чего получаем недостатки ООП: отсутствует ссылочная прозрачность, т.к. изменение состояния объектов вызывает сторонние эффекты, реакцию объекта на сообщение нельзя однозначно рассчитать только по самому сообщению. Это затрудняет автоматическую верификацию кода, а также усложняет применение методов обобщённого и порождающего программирования.
-
Иван
29 Март 2016 07:48:08 (ссылка)К спору о том, наследуются ли приватные члены класса. Наткнулся на такое. Это относится к c#, но, возможно, в c++ так же.
"Классы (но не структуры) поддерживают наследование.Класс, производный от другого (базового класса), автоматически включает все открытые, защищенные и внутренние члены базового класса, за исключением конструкторов и деструкторов"
Источник - msdn.
https://msdn.microsoft.com/ru-ru/library/ms173109.aspx -
Ольга
30 Ноябрь 2016 17:02:06 (ссылка)Круто, очень хорошо расписал! Было бы здорово разобрать побольше вопросов, например из списка «327 вопроса на собеседование Java Developer»
http://becomejavasenior.com/blog/2015/07/01/327-interview-questions-java-developer/