С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
#1

Явное наследование конструкторов - C++

15.08.2012, 23:12. Просмотров 2272. Ответов 2
Метки нет (Все метки)

Если препод требует наследовать констуркторы явно что он имеет ввиду делать это только для дефолтных конструкторов или для не дефолтных тоже надо это делать
и какая должна быть имплементация таких дерайфтных дефолтных конструкторов
пустая ???

или не пустая например

C++
1
2
3
4
5
    Derived::Derived() : Base()
    {
        CentralPoint = Point(0,0); 
        RadiusPoint = Point(0,0) ; 
    }
или должно быть так ???
C++
1
2
3
4
Derived::Derived() : Base()
    {
        
    }
вообще явное наследование не дефолтых констукторов это же ахинея так ? ???

что такое initialization list?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2012, 23:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Явное наследование конструкторов (C++):

Наследование конструкторов - C++
если при наследовании классов отсутствует конструктор в базовом классе, то что тогда? Помогите, не могу найти ответ в инете.

Наследование конструкторов - C++
Здрасти. Такая проблема. У меня есть классы с таким наследованием: KIERUNEK-->PRZEDMIOT-->OCENA<--STUDENT Вот конструкторы класса...

Наследование конструкторов? - C++
Сдаю лабораторную на тему наследования в С++ : #include <iostream> using namespace std; class hero { protected: int jiv; ...

Наследование конструкторов - C++
Добрый день. Подскажите как правильно осуществить наследование конструктора в двух файлах h и cpp. В одном h файле все работало. ...

Наследование конструкторов - C++
Вопрос по теории наследования: Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним...

Наследование конструкторов - C++
Здравствуйте! У меня такой вопрос: Как сделать так, чтобы при создании объекта дочернего класса не вызывался конструктор родительского? При...

2
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 249
16.08.2012, 03:02 #2
Цитата Сообщение от Leeto Посмотреть сообщение
Если препод требует наследовать констуркторы явно что он имеет ввиду делать это только для дефолтных конструкторов или для не дефолтных тоже надо это делать
и какая должна быть имплементация таких дерайфтных дефолтных конструкторов
пустая ???
Конструктор выполняет необходимые действия для создания объекта класса (заполнение полей и т.д.). Если ты наследуешься от базового класса, у которого в конструкторе есть какие-то действия, то чтобы не переписывать их (если конечно их нужно выполнить), ты вызываешь этот конструктор из конструктора наследуемого класса, и если не все необходимые действия выполняются, то дописываешь их. Так что здесь нужно смотреть на то, что выполняет тот или иной конструктор. Если дефолтный конструктор базового класа выделяет память под динамический массив, который играет важную роль в базовом и наследуемом классе, то нужно бы его вызывать не только из дефолтного конструктора.

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Base {
  public:
    Base() {
      a = new char[20];
    }
 
   private:
     char* a;
};
 
 
class Child : public Base {
  public:
    Child() : Base() {   // вызов конструктора Base, иначе под массив a не выделиться память
      c = 0;
    }
 
    Child(int _c) : Base() {  // Здесь тоже самое
       c = _c;
    }
  private:
    int c;
}
Добавлено через 8 минут
Цитата Сообщение от Leeto Посмотреть сообщение
вообще явное наследование не дефолтых констукторов это же ахинея так ? ???
Это нормальное являение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Point {
 public:
  Point() {
   x = 0; y = 0;
  }
  Point(int x, int y) {
   this->x = x;
   this->y = y;
  }
 private:
  int x, y; 
};
 
class Circle : public Point {
 public:
  Circle() : Point() {
   range = 0;
  }
  
  Circle(int x, int y, int range) : Point(x, y) {   // Вызывая Point(x,y), мы заполняем x,y для Circle
    this->range = range;
  }
 private:
  int range;
};
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2012, 07:12 #3
Цитата Сообщение от StasGamilton Посмотреть сообщение
Child() : Base() { // вызов конструктора Base, иначе под массив a не выделится память
Выделится. Если в списке инициализаторов (initialization list), конструктора производного класса, явно не вызван конструктор базового класса, то автоматически будет вызван конструктор по умолчанию базового класса. В любом случае, при создании (выделении памяти под) объекта производного класса, программа сначала создаёт (выделяет память под) объект базового класса. И происходит это до того, как программа дойдёт до тела конструктора производного класса, в котором происходит занесение, в уже выделенную память, значений полей объекта производного класса. Для этого используется список инициализаторов элементов. Объект базового класса должен быть создан первым, поэтому, если не вызывать, в списке инициализаторов, конструктор базового класса, то будет вызван конструктор по умолчанию базового класса. Если же не нужен конструктор по умолчанию, а нужен какой-нибудь другой конструктор базового класса, то его следует явно указать в списке инициализаторов.

Добавлено через 10 минут
Цитата Сообщение от Leeto Посмотреть сообщение
Если препод требует наследовать констуркторы явно что он имеет ввиду делать это только для дефолтных конструкторов или для не дефолтных тоже надо это делать
В каждом объекте производного класса, есть объект базового класса. Каким конструктором хотите инициализировать поля этого объекта базового класса, такой конструктор и вызывайте в списке инициализаторов. Если никакой не вызовите, то автоматически будет вызван конструктор по умолчанию базового класса.

Цитата Сообщение от Leeto Посмотреть сообщение
и какая должна быть имплементация таких дерайфтных дефолтных конструкторов
пустая ???
или не пустая например
Не должна. Какая нужна вам. Какую напишите, та и будет.

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Base 
{
  public:
    Base() 
    {
      x = 0;
      a = 0;
    }
    
    Base(int n) 
    {
      x = n;
      a = new char[20];
    }
    
 private:
     char* a;
     int x;
};
 
 
class Child : public Base 
{
  public:
    Child() : Base() // явный вызов конструктора по умолчанию для объекта Base.
    {   
      c = 0;
    }
 
    Child(int _c)  // Здесь будет неявный вызов конструктора по умолчанию для объекта Base.
    {  
       c = _c;
    }
    
    Child(int a, int _c) : Base(a) // Явный вызов конструктора для объекта Base.
    {  
       c = _c;
    }
 
private:
    int c;
};
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2012, 07:12
Привет! Вот еще темы с ответами:

Наследование конструкторов - C++
Создать класс CPoint – точка. На его основе создать классы CColoredPoint и CLine. На основе класса СLine создать класс CcoloredLine и класс...

Наследование конструкторов - C++
Здравствуйте, мне нужно что бы player наследовал конструктор от aobject class aobject { public: aobject(int xx,int yy,int** mm)...

Наследование конструкторов классов - C++
может ли конструктор класса-наследника иметь меньше переменных,чем конструктор класса-отца?

Наследование конструкторов с параметрами и деструктора - C++
Данно два класс. Родитель: class entity { private: int ID = 0; class object_list * list_; protected: std::string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.