Форум программистов, компьютерный форум CyberForum.ru

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

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

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

15.08.2012, 23:12. Просмотров 2148. Ответов 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2012, 23:12     Явное наследование конструкторов
Посмотрите здесь:

Наследование конструкторов? C++
C++ Наследование конструкторов
C++ Наследование конструкторов
Наследование конструкторов C++
Наследование конструкторов C++
Наследование конструкторов C++
C++ Наследование конструкторов
C++ Наследование конструкторов с параметрами и деструктора
Наследование конструкторов классов C++
C++ Наследование - вызов конструкторов и деструкторов
Наследование конструкторов C++
C++ наследование классов и использование конструкторов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
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;
};
alsav22
5415 / 4811 / 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;
};
Yandex
Объявления
16.08.2012, 07:12     Явное наследование конструкторов
Ответ Создать тему
Опции темы

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