Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Наследование конструкторов

04.03.2015, 08:49. Показов 4655. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос по теории наследования:
Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним аргументом.
Был создан производный от исходного класс, с применением паблик наследования.
Будут ли объекты производного класса иметь доступ ко обоим конструкторам базового класса?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.03.2015, 08:49
Ответы с готовыми решениями:

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

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

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

15
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
04.03.2015, 08:50
Наверное, только через свои конструкторы.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
04.03.2015, 08:55
Обязательно.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 09:09  [ТС]
А если в производном классе вообще не писать конструкторов?
В одной книге по Си++ приводится пример наследования конструктора без аргументов без его определения в производном классе, но автор пишет что конструктор с аргументами таким образом не наследуется. Что за парадокс? Без аргументов наследуется а с аргументами нет, в чем причина?

Добавлено через 13 минут
Ilot, ?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
04.03.2015, 09:45
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Без аргументов наследуется а с аргументами нет, в чем причина?
Брехня.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
class A {
public:
    A() {
        std::cout << "I'm A()\n";
    }
    A(int i) {
        std::cout << "I'm A(int)\n";
    }
};
class B: public A {
public:
    A * getA(int t) {
        return new A(t);
    }
};
int main() {
    B b;
    A * a = b.getA(11);
    return 0;
}
Но строго говоря конструкторы относятся к той категории функций которые не наследуются. Еще из этой телеги конструктор копированя, оператор присвоения и деструктор. В классах наслдениках будут созданы свои подобные функции. Остальные public(protected) функции наследуются обычным способом.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.03.2015, 12:44
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
приводится пример наследования конструктора без аргументов без его определения в производном классе
Возможно имелось ввиду это:
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
class Base1 {
public:
   // конструктор Base1() неявно удален потому что определен
   // пользовательський конструктор
   Base1(int) {}
};
 
class Derived1 : public Base1 {
 
};
 
class Base2 {
public:
   Base2() {}
   Base2(int) {}
};
 
class Derived2 : public Base2 {
 
};
 
int main()
{
   //Derived1 d1; // Error конструктор Derived1() неявно удален
   Derived2 d2;
}
Добавлено через 17 минут
В С++11 появилось еще вот такое наследование конструкторов:
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 Base1 {
public:
   Base1() { std::cout << "Base1().\n"; }
   Base1(int) { std::cout << "Base1(int).\n"; }
};
 
class Derived1 : public Base1 {};
 
class Base2 {
public:
   Base2() { std::cout << "Base2().\n"; }
   Base2(int) { std::cout << "Base2(int).\n"; }
};
 
class Derived2 : public Base2 {
public:
   using Base2::Base2;
};
 
int main()
{
   //Derived1 d1(42); // Error. нету Derived1(int) и он не наследуется
   Derived1 d2; // Ok. Derived1() генерируется компилятором по умолчанию
   Derived2 d3(42); // Ok. Derived2(int) наследуется
}
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 18:12  [ТС]
DiffEreD, Ilot,
Я вот этот пример имею в виду. Конструктор не наследуется.

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
43
44
45
46
47
48
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
class Counter
{
protected:
    unsigned int count;
public:
    Counter() : count(0)
    { }
    Counter(int c) : count(c)
    { }
    unsigned int get_count() const
    {
        return count;
    }
    Counter operator++()
    {
        return Counter(++count);
    }
};
 
class CountDn : public Counter
{
public:
    Counter operator--()
    {
        return Counter(--count);
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    CountDn c1; // тут все ок, наследуется конструктор без арг-ов
    //CountDn c1(2); // а тут "отсутствуют экземляры конструктора с одним арг-ом"
    cout << "\n c1 =" << c1.get_count();
    ++c1; ++c1; ++c1;
    cout << "\n c1 =" << c1.get_count();
    --c1; --c1;
    cout << "\n c1 =" << c1.get_count();
    cout << endl;
    system("pause");
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 18:24
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
// тут все ок, наследуется конструктор без арг-ов
Он и тут не наследуется. Тут используется конструктор по-умолчанию, т.к. ты сам не определил ни одного конструктора в классе CountDn, то компилятор сам сделал конструктор без аргументов. Его поведение таково, что вызываются конструкторы базовых классов и конструкторы полей. Так что это только кажется, на самом деле у каждого класса свои конструкторы.

Про С++11 и его способ "перетащить" конструктор из базового класса в наследника выше уже сказали.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 18:33  [ТС]
DrOffset,
Но почему Лафоре в своей книге пишет следующее:

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 18:38
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Но почему Лафоре в своей книге пишет следующее:
Лафоре графоман. Я серьезно.
Причем я сначала думал, что это просто перевод такой, но в оригинале там тоже самое.
Вот тебе настоящий источник:
12.1/4
A default constructor for a class X is a constructor of class X that can be called without an argument. If
there is no user-declared constructor for class X, a constructor having no parameters is implicitly declared
as defaulted
(8.4). An implicitly-declared default constructor is an inline public member of its class.
1
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 18:43  [ТС]
DrOffset,
На основе сообщений выше я правильно понял, что в любом случае нужно в производных классах писать свои конструкторы, которые ссылаются на базовый?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 18:57
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
На основе сообщений выше я правильно понял, что в любом случае нужно в производных классах писать свои конструкторы, которые ссылаются на базовый?
Не в любом, а когда это нужно.
Если тебя устраивает, что конструктор наследника вызывает конструктор базового класса без параметров, то можно не писать. Если нужно например такое, как в примере ниже, то придется сделать конструктор (или использовать фичи С++11).
Небольшой поясняющий пример:
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
#include <iostream>
 
class Base
{
public:
    Base(int v) 
       : v_(v)
    {}
    
   
    int getV() const { return v_; }
    
private:
    int v_;
};
 
class Derived : public Base
{
public:
    //Если этот конструктор не определить, то будет ошибка. 
    //Т.к сгенерированный конструктор попытается вызвать конструктор без параметров базового класса.
    //Но его в нем нет, т.к. мы сами определили конструктор с одним параметром, 
    //взяв на себя дальнейшую ответственность за создание конструкторов в нем.
    Derived() : Base(12) {}
};
 
int main()
{
    Derived d;
    std::cout << d.getV();
}
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 19:21  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Derived() : Base(12) {}
Почему именно 12?


Зачем писать
C++
1
std::cout << d.getV();
когда можно написать
C++
1
using namespace std;
Добавлено через 7 минут
Ааа, я понял, при создании неинициализированного объекта производного класса, вызывается конструктор без арг-ов этого класса, который вызывает конструктор с одним параметром из базового класса, тем самым поле объекта инициализируется 12?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
04.03.2015, 19:30
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Почему именно 12?
Мне так захотелось. Это непринципиально.

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
когда можно написать
Можно.
Пишу так, потому что минимальные проекты, с которыми я работаю, давно превышают несколько миллионов строк. Если ты будешь раскидываться в таких проектах импортами других неймспейсов в глобальное пространство, то скорее всего будешь бит или сброшен с моста с зацементированными ногами.

Простой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <functional>
#include <iostream>
 
using namespace std;
 
int function()
{
     return 12;
}
 
int main()
{
    cout << function();
    return 0;
}
Демонстрация.

Добавлено через 32 секунды
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Ааа, я понял, при создании неинициализированного объекта производного класса, вызывается конструктор без арг-ов этого класса, который вызывает конструктор с одним параметром из базового класса, тем самым поле объекта инициализируется 12?
Так точно
0
04.03.2015, 19:41

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Почему именно 12?
Мне так захотелось. Это непринципиально.
На самом деле должно быть 42. DrOffset (надеюсь, случайно) нарушил принцип Жизни, Вселенной и Всего Остального.

0
04.03.2015, 20:26

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
На самом деле должно быть 42. DrOffset (надеюсь, случайно) нарушил принцип Жизни, Вселенной и Всего Остального.
На самом деле не нарушил, просто время еще не пришло. А теперь пришло - 8.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2015, 20:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru