803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
1

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

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

Вопрос по теории наследования:
Есть некоторый базовый класс с двумя конструкторами типа паблик, первый без аргумента, второй с одним аргументом.
Был создан производный от исходного класс, с применением паблик наследования.
Будут ли объекты производного класса иметь доступ ко обоим конструкторам базового класса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2015, 08:49
Ответы с готовыми решениями:

Наследование конструкторов
Здрасти. Такая проблема. У меня есть классы с таким наследованием:...

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

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

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

15
1172 / 833 / 359
Регистрация: 26.02.2015
Сообщений: 3,743
04.03.2015, 08:50 2
Наверное, только через свои конструкторы.
0
Эксперт по математике/физикеЭксперт С++
2001 / 1332 / 379
Регистрация: 16.05.2013
Сообщений: 3,450
Записей в блоге: 6
04.03.2015, 08:55 3
Обязательно.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 09:09  [ТС] 4
А если в производном классе вообще не писать конструкторов?
В одной книге по Си++ приводится пример наследования конструктора без аргументов без его определения в производном классе, но автор пишет что конструктор с аргументами таким образом не наследуется. Что за парадокс? Без аргументов наследуется а с аргументами нет, в чем причина?

Добавлено через 13 минут
Ilot, ?
0
Эксперт по математике/физикеЭксперт С++
2001 / 1332 / 379
Регистрация: 16.05.2013
Сообщений: 3,450
Записей в блоге: 6
04.03.2015, 09:45 5
Цитата Сообщение от 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
1456 / 793 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
04.03.2015, 12:44 6
Цитата Сообщение от 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
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 18:12  [ТС] 7
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
16476 / 8974 / 2200
Регистрация: 30.01.2014
Сообщений: 15,588
04.03.2015, 18:24 8
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
// тут все ок, наследуется конструктор без арг-ов
Он и тут не наследуется. Тут используется конструктор по-умолчанию, т.к. ты сам не определил ни одного конструктора в классе CountDn, то компилятор сам сделал конструктор без аргументов. Его поведение таково, что вызываются конструкторы базовых классов и конструкторы полей. Так что это только кажется, на самом деле у каждого класса свои конструкторы.

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

Наследование конструкторов
0
16476 / 8974 / 2200
Регистрация: 30.01.2014
Сообщений: 15,588
04.03.2015, 18:38 10
Цитата Сообщение от 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
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 18:43  [ТС] 11
DrOffset,
На основе сообщений выше я правильно понял, что в любом случае нужно в производных классах писать свои конструкторы, которые ссылаются на базовый?
0
16476 / 8974 / 2200
Регистрация: 30.01.2014
Сообщений: 15,588
04.03.2015, 18:57 12
Цитата Сообщение от 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
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.03.2015, 19:21  [ТС] 13
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Derived() : Base(12) {}
Почему именно 12?


Зачем писать
C++
1
std::cout << d.getV();
когда можно написать
C++
1
using namespace std;
Добавлено через 7 минут
Ааа, я понял, при создании неинициализированного объекта производного класса, вызывается конструктор без арг-ов этого класса, который вызывает конструктор с одним параметром из базового класса, тем самым поле объекта инициализируется 12?
0
16476 / 8974 / 2200
Регистрация: 30.01.2014
Сообщений: 15,588
04.03.2015, 19:30 14
Цитата Сообщение от 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
Tulosba
04.03.2015, 19:41
  #15

Не по теме:

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

0
DrOffset
04.03.2015, 20:26     Наследование конструкторов
  #16

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2015, 20:26

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru