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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование конструкторов 
:(
    Опции темы
EvilsInterrupt
Дата 22.7.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



В виду того что тема может быть полезна любому новичку, потому все вопросы вокруг исключения и рядом с ними пусть будут в одной теме

Код

#include <iostream>
#include <stdexcept>

/*----------------------------------------------------------------------------*/
using std::cout;
using std::endl;
/*----------------------------------------------------------------------------*/
class CMyExc : std::exception {};
/*----------------------------------------------------------------------------*/
int main()
{
  try 
  {
    throw CMyExc("throw CMyExc1()");
  }
  catch(std::exception & e)
  {
    cout << "e.what(): " << e.what() << endl;
    return(1);
  }
  return(0);
}


Спрашивал Lazin`a и он говорит, бага :

Цитата

Error    1    error C2440: '<function-style-cast>' : cannot convert from 'const char [16]' to 'CMyExc'    e:\Development\proba\proba.cpp    15    proba


связана с тем что потомок не наследует конструкторы базовогого! Мне  интересно почему это так надо ?

Это сообщение отредактировал(а) bsa - 22.7.2009, 20:14
PM MAIL WWW ICQ Jabber   Вверх
Gordon
Дата 22.7.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

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



Цитата(EvilsInterrupt @  22.7.2009,  14:31 Найти цитируемый пост)
связана с тем что потомок не наследует конструкторы базовогого! 


Ну да, и тогда конструктор потомка должен вызвать конструктор базового (это если в базовом классе все конструкторы с аргументами и агрументам не присваивается значение по умолчанию).

Цитата(EvilsInterrupt @  22.7.2009,  14:31 Найти цитируемый пост)
Мне  интересно почему это так надо ?


Что так надо? 


--------------------

  
     
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 22.7.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



>>Что так надо?  
В случае методов, могу их не реализовывать! Просто реализация унаследовалась и могу спокойно их вызвать без каких-либо проблем! С конструкторами же, даже если они реализованы в базовом уже не так, я должен явно в секции инициализации конструктора потомка указать вызового конструктора. 

пример:

Child::Child(char * t) :
  Base(t)
{}

почему мне это надо делать ? Не пойму логику стандарта, если уж чтото сделано, то почему методы можно наследовать, а конструкторы заново реализовывать надо ?
PM MAIL WWW ICQ Jabber   Вверх
Gordon
Дата 22.7.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

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



Цитата(EvilsInterrupt @  22.7.2009,  19:00 Найти цитируемый пост)
Не пойму логику стандарта, если уж чтото сделано, то почему методы можно наследовать, а конструкторы заново реализовывать надо ?


Может хотябы по тому, что лучше всех знает как инициализировать/"уничтожать" объекты класса его разработчик...


--------------------

  
     
PM MAIL WWW   Вверх
bsa
Дата 22.7.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



EvilsInterrupt, ну, например, потому что у конструкторов базового класса название отлично от названия класса потомка.
PM   Вверх
Леопольд
Дата 22.7.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

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



Цитата(EvilsInterrupt @ 22.7.2009,  13:31)
интересно почему это так надо ?

Код

class Base{
public:
   Base(int = 0) {}
   Base(float = 0) {}
};

class Child: public Base{
public:
   Child(int, float) {}
};

int main(void){
   Child obj(1, 2);
   return 0;
}


Какой из конструкторов базового класса должен быть вызван? Уверен, если подумать, то можно найти ещё причины.
Если же есть единственный конструктор по умолчанию, то будет вызван именно он.

Цитата(EvilsInterrupt @ 22.7.2009,  13:31)
В случае методов, могу их не реализовывать! Просто реализация унаследовалась и могу спокойно их вызвать без каких-либо проблем! С конструкторами же, даже если они реализованы в базовом уже не так, я должен явно в секции инициализации конструктора потомка указать вызового конструктора.

Конструктор - инициализация объекта во время создания. Как реализация базового конструктора может инициализировать объект наследник? Базовый класс ничего не знает о наследнике. Я лично не могу представить каким образом можно унаследовать реализацию базового конструктора для общего случая.

Это сообщение отредактировал(а) Леопольд - 22.7.2009, 20:57


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Lazin
Дата 22.7.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(EvilsInterrupt @  22.7.2009,  18:00 Найти цитируемый пост)
пример:

Child::Child(char * t) :
  Base(t)
{}

почему мне это надо делать ? Не пойму логику стандарта, если уж чтото сделано, то почему методы можно наследовать, а конструкторы заново реализовывать надо ?

логика простая: откуда компилятор узнает, какой из конструкторов вызвать, если их несколько?
на самом деле конструктор базового класса вызывается всегда, даже если ты его не вызываешь явно, но это будет конструктор по умолчанию smile 
PM MAIL Skype GTalk   Вверх
hsilgos
Дата 22.7.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 26.4.2009

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



В будущем стандарте планируется ввести что-то типа наследования. Чтобы не создавать свой пустой конструктор и дергать базовый, можно будет в теле класса написать что-то типа:
Код

struct B1 {
  B1( int, int ) {}
};

struct B2 {
  B2( double, double ) {}
};

struct D1 : B1 {
  using B1::B1;  // impliclty declare D1( int a1, int a2 ) : B1(a1, a2) {}
  int x;
};

struct D2 : B2 {
  using B2::B2; // impliclty declare D2( double a1, double a2 ) : B2(a1, a2) {}
  B1 b;
};


Это сообщение отредактировал(а) hsilgos - 22.7.2009, 23:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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