Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Иерархия животного мира, С++/ООP/ООD 
:(
    Опции темы
vitlic
Дата 2.4.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Вопрос был задан на собеседование:
Имплементация класса Петух на с++, с подклассами, функциями и т.д.

Собеседование проходило не в Росии, так что слово Петух добавочной смысловой нагрузки не несло smile


Мое решение было приблизительно таким, а еще было много болтавни какие функции и куда добовлять..
Код



---------
Animal|  Животный мир
---------
    ^ 
    |

---------
Birds   |   Общий класс птиц
---------
    ^ 
    |

----------------
Home Birds |  Домашняя птица
----------------
   ^ 
    |

---------
Chiken|  Куры, этот класс общий, от него наследует и петухи, и курицы
---------
    ^ 
    |
----------
Rooster|  петух на англ
----------



Вопрос такой, как правильно нужно добавить конструкторы/ виртуальные деструкторы, виртуальные функции, какие классы должны быть абстрактными и т.д.

На мой взгляд в этой иерархии все классы, кроме  Rooster, должны быть абстрактными.
Долго думал сделать или нет класс Animal пустым, но забыл в чем прелесть данного подхода..
Что вы думаете и какие функции вы бы добавили в эти классы?

пи.си. Запостил сюды, а не в другой раздел, так как имплементация должна быть на с++, да и интересует именно возможности объектного ориентированного подхода с++ к этой задаче.


Это сообщение отредактировал(а) vitlic - 2.4.2007, 19:27
PM WWW   Вверх
vinter
Дата 2.4.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(vitlic @  2.4.2007,  19:21 Найти цитируемый пост)
На мой взгляд в этой иерархии все классы, кроме  Rooster, должны быть абстрактными.

да

Цитата(vitlic @  2.4.2007,  19:21 Найти цитируемый пост)
Что вы думаете и какие функции вы бы добавили в эти классы?

есть, в туалет ходить и размножаться это в бердс, энимал убрать вообще, не нужен он здесь, а в остальные по специфике уже добавляй, тут непонятно какой совет требуетсяsmile кстати думаю петуха и курицу в разные классы, это слишком..по этой идеологии надо еще класс птенец, яйцо и эмбрион.


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 2.4.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Абстрактными - все классы, кроме самого нижнего в твоей иерархии.
У верхнего класса делаем виртуальный деструктор, как минимум.

Вопрос: какие функции есть у петуха? это и определяет, что у него виртуальное, а что нет, и какие функции где впервые объявляются.


Цитата(vitlic @  2.4.2007,  19:21 Найти цитируемый пост)
Что вы думаете и какие функции вы бы добавили в эти классы?

это во флейм... по крайней мере у меня мозги на эту тему работают слабо smile

Все вышеперечисленное, естественно, имхо.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vitlic
Дата 2.4.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Цитата(vinter @ 2.4.2007,  20:02)
есть, в туалет ходить и размножаться это в бердс, энимал убрать вообще, не нужен он здесь, а в остальные по специфике уже добавляй, тут непонятно какой совет требуетсяsmile кстати думаю петуха и курицу в разные классы, это слишком..по этой идеологии надо еще класс птенец, яйцо и эмбрион.

Просто интересно кто, что думает. 

Насчет разделения петуха и курицы: я описал класс петуха, а класс курицы на словах добавил. Но теперь понимаю, что это скорее всего ошибка, так как кем же быдет класс птенца? он должен наследовать от петуха и курицы, но и являться петухом или курицей   smile  Добавил после: Понимаю, что нес несуразицу) 
такое наверно сделать не возможно с помощью oop. 

Это сообщение отредактировал(а) vitlic - 2.4.2007, 22:00
PM WWW   Вверх
threef
Дата 2.4.2007, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



ИМХО петух и курица разные классы ! Если труктуры можно сделать с флажком пола, то классы - точно разные. Классы содержат ПОВЕДЕНИЕ объекта, а какое  у курицы поведение ?Кудахчет, несется... А петух - он же топчет ! Разный, разный класс.  ;)
А так чего кому дабавить лучше всего у Дарвина прописано.  Виртуальный деструктор сильно нужен, если ресурсы цепляешь в классе. А просто так он ни для чего. 
Кстати, не забудь - куры летают, только они летают только вниз ! (красота летают только - только летают. Че русский язык не вытерпит !).
PM MAIL   Вверх
vitlic
Дата 2.4.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Цитата(threef @ 2.4.2007,  21:29)
ИМХО петух и курица разные классы ! Если труктуры можно сделать с флажком пола, то классы - точно разные. Классы содержат ПОВЕДЕНИЕ объекта, а какое  у курицы поведение ?Кудахчет, несется... А петух - он же топчет ! Разный, разный класс.  ;)
А так чего кому дабавить лучше всего у Дарвина прописано.  Виртуальный деструктор сильно нужен, если ресурсы цепляешь в классе. А просто так он ни для чего. 
Кстати, не забудь - куры летают, только они летают только вниз ! (красота летают только - только летают. Че русский язык не вытерпит !).

С логической точки зрения согласен. Но тогда появляется вопрос, как быть с цыплятами. Хотя можно и не  создавать для них отдельный класс. Думаю так даже верней!
В любом случае петухи не несут яиц.  Поэтому наверно и нужно два различных класса. 

Виртуальный деструктор нужен в любом случае, так как я ведь не уверен будут ли к объекту обращаться на прямую:
  Петух п;
или через поинтер базового класса:
  Птица * птиц=&п;

Если все обращения первого вида, то дефольтный деструктор подойдет, но если второго?
PM WWW   Вверх
threef
Дата 2.4.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Уговорил
PM MAIL   Вверх
Fazil6
Дата 2.4.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(vitlic @  2.4.2007,  21:57 Найти цитируемый пост)
Если все обращения первого вида, то дефольтный деструктор подойдет, но если второго?

а какая разница? Разве они(деструкторы) должны(могут) быть разные?

Это сообщение отредактировал(а) Fazil6 - 2.4.2007, 23:02
PM MAIL   Вверх
vitlic
Дата 2.4.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Цитата(Fazil6 @ 2.4.2007,  23:02)
Цитата(vitlic @  2.4.2007,  21:57 Найти цитируемый пост)
Если все обращения первого вида, то дефольтный деструктор подойдет, но если второго?

а какая разница? Разве они(деструкторы) должны(могут) быть разные?

В случае не виртуального деструктора при уничтожение объекта, через поинтер на базовый класс будет slicing, то бишь вызовется деструктор для базовой части производного объекта, а все остальное не разрушится.
Если есть виртуальный деструктор, то обращение к нему идет через vtbl, и таким образом вызовется в начале деструктор производного, который сам в дальнейшем вызовет деструктор базового.

А еще во многих книгах написано, если используется полиморфизм, то обязательно нужен виртуальный деструктор. Но если он не используется и создание объектов идет напрямую, то можно и без виртуальных деструкторов.

Это сообщение отредактировал(а) vitlic - 2.4.2007, 23:34
PM WWW   Вверх
threef
Дата 2.4.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Код

class Bird
{
   public:
       virtual ~Bird(){ cout<<" Bird out"; }
};
class Rooster:public Bird
{
  public :
      
       ~Rooster(){ cout <<" Rooster"; }
};

int f()
{
      
      Bird * b = new Rooster;
      delete b;
       return 1;
}
int one=f();


так будут вызваны оба деструктора, а не только деструктор Bird
PM MAIL   Вверх
Fazil6
Дата 3.4.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(vitlic @  2.4.2007,  23:30 Найти цитируемый пост)
В случае не виртуального деструктора при уничтожение объекта, через поинтер на базовый класс будет slicing, то бишь вызовется деструктор для базовой части производного объекта, а все остальное не разрушится.Если есть виртуальный деструктор, то обращение к нему идет через vtbl, и таким образом вызовется в начале деструктор производного, который сам в дальнейшем вызовет деструктор базового.

А еще во многих книгах написано, если используется полиморфизм, то обязательно нужен виртуальный деструктор. Но если он не используется и создание объектов идет напрямую, то можно и без виртуальных деструкторов.


ого... Прям как солнце из-за туч... Я спрашиваю почему возникает вопрос, что дефолтный конструктор удовлетворяет в первом случае и неудовлетворяет во втором. Ведь решение что
Цитата(vitlic @  2.4.2007,  21:57 Найти цитируемый пост)
Виртуальный деструктор нужен в любом случае,

принято помоему однозначное. Разве объект Петух должен разрушаться поразному в первом и втором случае?

Это сообщение отредактировал(а) Fazil6 - 3.4.2007, 00:19
PM MAIL   Вверх
Earnest
Дата 3.4.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(threef @  2.4.2007,  22:29 Найти цитируемый пост)
ИМХО петух и курица разные классы 

Не согласна. Нет контекста задачи. Если рассматривать кур в контексте корма для лис, то по барабану какой у них там пол. Или в контексте производства мыла из старой птицы. Или производства гуано...
Или в контексте задачи, которую решали разрушители мифов, когда проверяли при стрельбе какой тушкой производятся бОльшие разрушения: замороженной или отмороженной.
 smile 
Не может быть построен хороший класс "петух вообще", без конкретизации задачи.



--------------------
...
PM   Вверх
vitlic
Дата 3.4.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.2.2007
Где: где home(){return где="тут"}

Репутация: 1
Всего: 1



Earnest, 
Они больше ничего и не объясняли, скорее всего проверяли не только знание OOP, но и абстрактное мышление, фантазию и т.д.
PM WWW   Вверх
threef
Дата 3.4.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Earnest, я не понимаю, почему ты не согласна, что я могу иметь личное мнение ? Там же написано, МОЕ. Кроме того, в иерархии классов, которая включает животные - птицы - курьи -... вряд ли они(куры) будут рассматриваться с точки зрения лисьей жратвы или пушечного снаряда. 
PM MAIL   Вверх
Earnest
Дата 3.4.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(threef @  3.4.2007,  11:07 Найти цитируемый пост)
Earnest, я не понимаю, почему ты не согласна, что я могу иметь личное мнение ? Там же написано, МОЕ.

Вот с ним (мнением) и не согласна. А не с тем фактом, что ты можешь иметь личное мнение. Имей.  smile 

vitlic, я, конечно, понимаю, собеседование, то-се. Но есть еще один аспект. Потенциальный работодатель мог этим вопросом пытаться выяснить, не склонен ли ты бросаться решать задачу, не разобравшись толком, о чем она. Незнание чего-либо конкретного не так страшно, как каша в голове... 
Встречала я таких программистов... лучше сразу убить, чем пустить в проект... smile 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1367 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.