Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 20:09   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Как вызываются конструкторы объектов при наследовании?

Вот небольшой пример:
Код:
class A
{
TTest *t;
public:
 A()
 {
  t=new TTest(100); 
 }
}
Теперь я хочу унаследовать class B от А, но нужно, чтобы t создалось с парметром 200 (t=new TTest(200)).
В делфи всё понятно - там конструктор объекта, от которого идёт наследование, вызывается вручную (inherited)
TwiX вне форума Ответить с цитированием
Старый 15.11.2010, 20:32   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Примерно так:
Код:
class a
{
protected:
      TTest *t;
public:
      a() { t = new TTest(100); }
};

class b : public a
{
public:
      b() { t = new TTest(200); }
};
Без явного вызова конструктора базового класса.
Если я не ошибаюсь
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 16.11.2010 в 19:53.
Syuf вне форума Ответить с цитированием
Старый 15.11.2010, 20:40   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Я бы сделал примерно так:
Код:
class A
{
TTest t;
public:
 A(): t(100)
 { }
protected:
 A(int value): t(value)
 {}
};

class B: public A
{
public:
  B(): A(200)
  {}
}
pu4koff вне форума Ответить с цитированием
Старый 16.11.2010, 18:57   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Код:
B(): A(200)
А - он же без параметров?
Что значит "Без явного вызова конструктора базового класса."?
И когда вызывается конструктор объекта, от которого мы унаследовали другой объект? До второго конструктора или в конце конструктора?
TwiX вне форума Ответить с цитированием
Старый 16.11.2010, 20:59   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Код:
B(): A(200)
А - он же без параметров?
У меня в реализации было 2 конструктора. public без параметров и protected - с параметром. Можно реализовать и иначе, тут уж как больше нравится. Я лишь возможный вариант предложил.
Цитата:
Сообщение от TwiX Посмотреть сообщение
Что значит "Без явного вызова конструктора базового класса."?
Конструктор базового класса вызывается в любом случае. Если параметры никакие не нужно этому конструктору передавать, то его вызов никак и не указывается в коде (нет явного его вызова), если же нужно передать параметр (или просто хочется упомянуть о конструкторе базового класса), то уже идёт запись вида B(): A(200), т.е. явно вызываем контруктор базового класса.
Цитата:
Сообщение от TwiX Посмотреть сообщение
И когда вызывается конструктор объекта, от которого мы унаследовали другой объект? До второго конструктора или в конце конструктора?
Сначала выделяется память под весь объект, потом вызываются конструкторы базовых классов, потом конструкторы всех членов текущего класса, ну и в конце, соответственно, конструктор текущего класса.
Если взять для наглядности мой пример, то сначала вызовется конструктор класса А с параметром 200, а потом уже конструктор класса В, в котором у нас собственно ничего и нет
pu4koff вне форума Ответить с цитированием
Старый 16.11.2010, 23:11   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а ведь я тока не давно тему создавал по этому поводу
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2010, 01:33   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
Примерно так:
Код:
class a
{
protected:
      TTest *t;
public:
      a() { t = new TTest(100); }
};

class b : public a
{
public:
      b() { t = new TTest(200); }
};
Без явного вызова конструктора базового класса.
Если я не ошибаюсь
Ага, т.е. сначала вызывается a::a(), в котором выделяется память под t, затем вызывается b::b(), в котором выделяется ещё память под ту же t. А старая куда?

И вообще, как-то заморочено. TwiX, а оно точно нужно так делать?
Carbon вне форума Ответить с цитированием
Старый 17.11.2010, 03:55   #8
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Такое вообще делать не нужно) Просто вдруг захотелось разобраться)
Пепел, там не то) Про то, как вызвать конструктор других переменных перед конструктором себя я знаю =)
TwiX вне форума Ответить с цитированием
Старый 17.11.2010, 09:19   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Ага, т.е. сначала вызывается a::a(), в котором выделяется память под t, затем вызывается b::b(), в котором выделяется ещё память под ту же t. А старая куда?
Никуда. Будет утечка памяти. Поэтому обычно члены классов делают таки private и не размазывают прямой доступ к ним по всей иерархии. Работать со всеми членами классов нужно исключительно через get/set методы, а иначе вермишель вместо кода будет и память утекать аки через дуршлаг будет
pu4koff вне форума Ответить с цитированием
Старый 17.11.2010, 12:47   #10
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

pu4koff, а лучше вообще указатели в явном виде не юзать. Юзать их обёртки. тада вапще проблем с утечкой не будет в принципе.
Carbon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка объектов при помощи DLL Kompuklumba Общие вопросы Delphi 4 06.11.2010 15:20
Проблема при использовании прозрачности объектов в OpenGL Gwaeron Помощь студентам 0 22.04.2010 11:18
Перегрузка == при наследовании paramon Общие вопросы C/C++ 5 17.06.2008 00:17