Войти
ПрограммированиеФорумОбщее

ООП, С++

Страницы: 1 2 3 Следующая »
#0
19:24, 23 июля 2009

Реально ли такое:

1. Создать базовый класс с функцией Render()
2. Создать производные от него классы
3. Запихать обьекты производных классов в вектор
4. И для каждого вызвать Render(), но так чтобы вызывалась реализация как в производном классе..

А?)


#1
19:29, 23 июля 2009

это и есть ООП

#2
19:31, 23 июля 2009

реально

#3
19:39, 23 июля 2009

Spiteful
>3. Запихать обьекты производных классов в вектор
указатели на объекты

#4
19:40, 23 июля 2009

unsigned
http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование

#5
19:46, 23 июля 2009

Pushkoff
> Spiteful
> > . Запихать обьекты производных классов в вектор
> указатели на объекты

Указатели родительского класса на объекты дочерних классов.

Spiteful
> 1. Создать базовый класс с функцией Render()

Про виртуальный деструктор не забудь... (или забудь про С++)

#6
19:46, 23 июля 2009

Ну и как?)) Я вот что сделал:

class CRenderObject
{
public:
  CRenderObject(void);
  ~CRenderObject(void);
  virtual void Render();
};
/////////
class CText :
  public CRenderObject
{
public:
  CText(void);
  ~CText(void);
  void Render();
};

Но шоб создать его надо указывать тип производного класса :
CRenderObject *Test1 = new CText;

А я хочу шоб просто запихать все в вектор типа CRenderObject и потом в цикле для каждого Render()

Надеюсь понятно, что я хочу ))

#7
19:48, 23 июля 2009

это не ооп, а всего лишь dynamic dispatch :)

#8
20:01, 23 июля 2009

Spiteful
Непонятно, что мешает тебе сделать ровно то, что ты сказал? Класс вроде написал как надо, только деструктор должен быть виртуальным

#9
20:06, 23 июля 2009
Но шоб создать его надо указывать тип производного класса :
CRenderObject *Test1 = new CText;

Ыыыы.. Я прогнал... Мне ж полюбому обьект создавать надо будет)))00

указатели на объекты

Да, точна
#10
20:32, 23 июля 2009

oistalker
> Про виртуальный деструктор не забудь... (или забудь про С++)
Некоторые переоценивают роль виртуального деструктора. Напомню, что в.д. нужны только в некоторых сугубых случаях:

1. У вас есть классы.
2. При этом есть наследование одного класса от другого.
3. Этого мало, чтобы была польза от виртуальных деструкторов, надо, чтобы где-то использовались ссылки или указатели на родительский класс, которым в реальности подсунут объект дочернего класса. Если у вас такого никогда не будет - ЗАБУДЬТЕ про виртуальные деструкторы.
4. Если все деструкторы в таких иерархиях в программе (где есть родитель и потомок) будут инвариантно пустыми, то виртуальность тоже не принесет выгод.
5. Если например есть класс-родитель с (не обязательно пустым) деструктором, и ссылка или указатель будет именно на этот тип, но ВСЕ ЕГО ПОТОМКИ будут иметь тождественно пустые деструкторы, причем при любых перепроектированиях программы вы МОЖЕТЕ это гарантировать - пользы от виртуальных деструкторов тоже ноль и даже есть вред (кое-где написано, что вызов их не отнимает лишнего времени, однако это не так).
Ну и прочее и прочее и прочее.

Видите, насколько я круче вас в деструкторах шарю? :)
Ну естественно все вышесказанное относится не только к текущей версии системы - оно должно гарантироваться при любом перепроектировании. (в реальной жизни, как раз, обычно такое гарантировать и нельзя).

#11
20:51, 23 июля 2009

Osnova

http://en.wikipedia.org/wiki/Virtual_method

In the example below having no virtual destructor, while deleting an instance of class B will correctly call destructors for both B and A if the object is deleted as an instance of B, an instance of B deleted via a pointer to its base class A will produce undefined behaviour. On many implementations, the destructor for B will not be called in this situation.

Из стандарта процитировать не могу, его у меня больше нет :( Но там есть ссылка.

#12
20:54, 23 июля 2009

Osnova
> 4. Если все деструкторы в таких иерархиях в программе (где есть родитель и
> потомок) будут инвариантно пустыми, то виртуальность тоже не принесет выгод.
Вообще-то виртуальный деструктор минимум гарантирует корректное удаление членов класса-потомка при удалении по указателю на предка.

>5. Если например есть класс-родитель с (не обязательно пустым) деструктором, и ссылка или указатель будет именно на этот тип, но ВСЕ ЕГО ПОТОМКИ будут иметь тождественно пустые деструкторы
То же самое.

Вроде бы даже удаление потомков с нетривиальным деструктором (12.4[3], 12.4[4]) по указателю на предка без виртуального деструктора - это UB (5.3.5[3]) .

И кстати, что означают фразы "инвариантно пустой" и "тождественно пустой"?

#13
20:58, 23 июля 2009

#14
21:17, 23 июля 2009

Osnova
1, 2 есть почти всегда, после пункта 2 пошла глупость и непонимание основ :)
Вообще, какой смысл думать над этим? Есть простое правило - при наследовании деструкторы должны быть виртуальными всегда. Пользуйся и бед не будешь знать.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.