Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Наследование конструкторов  (Прочитано 21961 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
acc15
Гость
« : 25-05-2006 22:12 » 

Думаю примером будет проще объяснить
Код:
class A {

protected:
  int x;

public:
  A() { x=0; }
  A(int xx) { x=xx; }
  ~A() { }
};

class B : public A {
public:
   B(long xx) { x=(int)xx; }
};

int main(void)
{
  A a;
  B b; // ОШИБКА: Отсутствует конструктор по умолчанию
}
Вопрос: почему конструкторы не наследуются из класса A при наличии хотя бы одного конструктора в классе B??
« Последнее редактирование: 25-05-2006 22:19 от acc15 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 25-05-2006 22:24 » 

Вообще-то это делается так

class B : public A
{
public:
   B(long xx) : A(xx)
   {
     
   }
};

о каком наследовании ты говоришь?

зы Если я правильно понял - то ты хочешь виртуальный конструктор? Дык не бывает такого. Как ты себе представляешь развязку?
« Последнее редактирование: 25-05-2006 22:28 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
acc15
Гость
« Ответ #2 : 25-05-2006 22:36 » 

Нет... я не про это... это то понятно... Не наследуются конструкторы сами (как функции) т.е. у класса B при приведенном мной описании выше конструктор
A(int xx) { x=xx; } является недоступным без явного указания о классе А... также как и конструктор A() { x=0; }. Т.Е. Если класс B имеет хоть один конструктор, то конструкторы из класса A НЕ наследуются, а если класс B НЕ имеет конструкторов, тогда конструкторы наследуются из класса A.
Почему??

Вот полные примеры:
Код:
class c_Handle {

protected:
HANDLE Handle;
virtual void Initialize(void);

public:
c_Handle();
c_Handle(HANDLE h);
c_Handle(const c_Handle &h);
~c_Handle();

bool bLocked;
bool IsNull(void);

bool Close(void);
void FromHandle(HANDLE h);
operator HANDLE();
operator HANDLE*();
HANDLE operator=(HANDLE handle);
bool operator==(HANDLE handle);
bool operator!=(HANDLE handle);
};

class c_Event : public c_Handle {

public:
c_Event(куча параметров);
c_Event(куча параметров);
bool Create(куча параметров);
bool Open(куча параметров);
bool SetEvent(void);
bool ResetEvent(void);
bool PulseEvent(void);
DWORD WaitEvent(DWORD dwMilliseconds = INFINITE);
};
......
......
......
void somefunc(void)
{
   HANDLE Handle;
   c_Event Event(Handle); // <<< ОШИБКА!!!
   // У базового класса (c_Handle) есть такой конструктор,
   // однако (c_Event'у) он почему то не наследовался

   c_Event Event2; // <<< ОШИБКА!!!
   // У базового класса (c_Handle) есть и такой конструктор, да
   // и сам компилятор должен быть в состоянии создать конструктор
   // по умолчанию без явного указания оного...

   // Однако ругается на то что нету таких конструкторов...
}
« Последнее редактирование: 06-12-2007 18:12 от Алексей1153++ » Записан
LP
Помогающий

ru
Offline Offline

« Ответ #3 : 28-05-2006 09:38 » 

Если в классе нет определенных пользователем конструкторов, то компилятор сам генерирует конструктор по умолчанию, который, кроме всего прочего, вызывает дефолтные конструкторы базовых классов. Если определен хотя бы один пользовательский конструктор, то конструктор по умолчанию не генерируется, поэтому и выдается ошибка.
PS А конструкторы вообще никогда не наследуются.
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-05-2006 17:37 » 

А ты передаешь параметры от конструктора c_Event конгструктору с_Handle?
Правда вопрос возникает, как предусмотреть все случаи? Т.е. у c_Handle много контрукторов с разным кол-вом параметров, как же предусмотреть передачу параметров для каждого случая?
зы. Джон, кстати это кажется написал. Но вот вопрос у меня такой возник.
Записан

ещё один вопрос ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 31-05-2006 07:32 » 

Цитата: nikedeforest
как же предусмотреть передачу параметров для каждого случая?
Написать все необходимые варианты конструкторов c_Event.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 31-05-2006 07:56 » 

Было такое предположение.
Но сомнения по поводу оформления есть.
Так чтоли будет выглядить?
Код:
daughter(int x, int y, int z):parent(x), parent(x,y), parent(x,y,z)
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 31-05-2006 08:15 » 

nikedeforest, нет не так

Использование
parent(x) и parent(x,y) подразумевает дефолтную инициаллизацию параметров  y,z и z. ЭТо раз. Два ты не можешь вызывать несколько конструкторов для одного объекта. ЭТо два.
Для создания объекта используется только ОДИН конструктор - какой именно зависит от конкретной ситуации:

daughter(int x):parent(x)
daughter(int x, int y:parent(x,y)
daughter(int x, int y, int z):parent(x,y,z)

"Исключение" при множественном наследовании

если

class daughter : public parent1, public parent2, public parent3

то

daughter(int x, int y, int z):parent1(x), parent2(x,y), parent3(x,y,z)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 31-05-2006 08:35 » 

Понял, спасибо.
Записан

ещё один вопрос ...
acc15
Гость
« Ответ #9 : 15-06-2006 09:05 » 

немного туповато выглядит:

c_Event() : c_Handle() {}
c_Event(HANDLE h) : c_Handle(h) {}

и т.д.
просто лишние строки, но ничего не поделать...
Записан
Alex437
Гость
« Ответ #10 : 10-08-2006 06:59 » 

немного туповато выглядит:
c_Event() : c_Handle() {}
c_Event(HANDLE h) : c_Handle(h) {}
Имхо ничего туповатого, нормальная ситуация. К тому же часто количество строк можно сократить за счет параметров по умолчанию. Вот в данной ситуации HANDLE наверно все равно придется чем-то инициализировать. Скорее всего можно было написать
c_Event(HANDLE h = 0) : c_Handle(h) {}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines