Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Наследование конструкторов


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

Код

#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


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

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


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

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


Что так надо? 

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

пример:

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

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

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


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

Автор: bsa 22.7.2009, 20:18
EvilsInterrupt, ну, например, потому что у конструкторов базового класса название отлично от названия класса потомка.

Автор: Леопольд 22.7.2009, 20:34
Цитата(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)
В случае методов, могу их не реализовывать! Просто реализация унаследовалась и могу спокойно их вызвать без каких-либо проблем! С конструкторами же, даже если они реализованы в базовом уже не так, я должен явно в секции инициализации конструктора потомка указать вызового конструктора.

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

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

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

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

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

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

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;
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)