Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
1

Наследование классов: неудачный пример из Лафоре

12.06.2014, 01:04. Показов 2269. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И снова всем доброй ночи . Начал читать про наследование классов и совсем запутался может быть вы мне растолкуете в чем ошибка и чего я не понял. Вот пример:

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
49
50
51
52
53
54
55
#include <iostream>
using namespace std;
 
class test
{
protected:
    int number;
public:
    test() :number(0)
    {
        cout << "Пустой Конструктор(test)" << endl;
    };
 
    test(int n) :number(n)
    {
        cout << "Конструктор с одним параметром(test)" << endl;
    };
 
    void display() const
    {
        cout << number << endl;
    };
 
    void operator++()
    {
        ++number;
    };
};
 
class tes :public test
{
public:
    void getzn()
    {
        cout << "Input zn: ";
        cin >> number;
    };
 
    void operator--()
    {
        --number;
    };
};
int main()
{
 
    tes t1;
    tes t2(5);
 
    t1.getzn();
    t1.display();
    t2.display();
 
return 0;
};
В учебнике написано цитата:

Создадим объект класса tes в функции main()

tes t1;

Эта строка означает, что t1 будет создан как объект класса tes и инициализирован нулем. Но в классе tes нет конструктора, каким же образом выполняется инициализация? Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса. В test конструктор класса tes отсутствует, и компилятор использует конструктор класса test без аргументов.

При компиляции данного примера возникает ошибка связанная вот с этим ( tes t2(5); ).


Но если я все правильно понял из того что написано в учебнике, пример должен работать т.к если обратить внимание на цитату, а именно на ту строчку которую я выделил жирным шрифтом. Мы увидим что если в наследуемом классе нет своего конструктора он обратиться к подходящему конструктору родителя. В конструкторе test у меня определен конструктор с одним параметром но он им почему то не пользуется.



В чем проблема??? подскажите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2014, 01:04
Ответы с готовыми решениями:

Пример из книги Лафоре
В третьей главе книги Лафоре по с++ есть пример использующий функцию getche(): #include &lt;iostream&gt;...

Лафоре Не компилируется пример
Вот текст кода#include &quot;msoftcon.h&quot; class Shape { protected: int xCo, yCo; color...

Пример из книги Лафоре
Здравствуйте! Не могли бы подсказать, по какой причине в листинге ниже переменные должны быть...

Непонятен пример из Лафоре
В 7й Главе Никак не могу понять как реализован выход из цикла #include &lt;iostream&gt; #include...

19
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.06.2014, 01:44 2
Проблема в "учебнике", который нужно немедленно выбросить и заменить на толковый. А что за "учебник" такой?
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 02:11 3
Цитата Сообщение от dicros Посмотреть сообщение
Создадим объект класса tes в функции main()
tes t1;
Эта строка означает, что t1 будет создан как объект класса tes и инициализирован нулем. Но в классе tes нет конструктора, каким же образом выполняется инициализация? Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса. В test конструктор класса tes отсутствует, и компилятор использует конструктор класса test без аргументов.
Чушь какая-то написана. Если можно, название книги и страницу.
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
12.06.2014, 02:53  [ТС] 4
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.

стр. 363
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
12.06.2014, 03:12 5
Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса.
Если мы не определили конструктор производного класса, то для базового класса будет вызван конструктор по умолчанию (без аргументов). И для полей производного класса будет вызван конструктор по умолчанию. А если их нет, то ничего не скомпилируется.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 03:19 6
Цитата Сообщение от dicros Посмотреть сообщение
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.
стр. 363
Что тут скажешь... Можно списать на неудачный перевод.
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.06.2014, 09:34 7
Цитата Сообщение от dicros Посмотреть сообщение
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.
Блин! Я так и думал. Я уже покритиковал этого «автора», но товарищ, который его мучает, написал, что конечно, но зато он «бу-бу-бу». Оказывается ни хрена не «бу-бу-бу», и бракодел в одном бракодел во всем.
Цитата Сообщение от alsav22 Посмотреть сообщение
Чушь какая-то написана.
Однако ж пишут, что эта чушь офигенно популярна среди американских студентов, причем настолько, что надо было ее четыре раза переиздавать, да еще и на русский переводить эту галиматью. Мда, дофига есть на свете, друг Горацио…
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
12.06.2014, 09:43  [ТС] 8
Mr.X, alsav22, а что посоветуете?? какой учебник скачать только чтобы он был для начинающих.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.06.2014, 10:52 9
Ради интереса решил посмотреть, что же пишет этот Лафоре. Для сравнения привожу оригинал и перевод.
Перевод в данном случае можно назвать адекватным, а вот саму идею использования "подходящего" конструктора из базового класса не стоит распространять на конструкторы с параметрами. У автора в примере указывается именно конструктор по умолчанию. Но сформулировано так, что и для других констукторов будут работать аналогичные правила, что, конечно, не соответствует действительности.
P.S. Оригинал книги издан в 2002 году, новых книг автор не писал (а жив ли он ещё?). Не знаю насколько в целом она хороша для начинающего, но учитывая некоторые неоднозначные формулировки автора и древность книги, стоит рассмотреть другие варианты. См. список литературы.
Миниатюры
Наследование классов: неудачный пример из Лафоре   Наследование классов: неудачный пример из Лафоре  
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.06.2014, 11:28 10
Цитата Сообщение от Tulosba Посмотреть сообщение
а вот саму идею использования "подходящего" конструктора из базового класса не стоит распространять на конструкторы с параметрами.
Ну так сама идея-то бредовая, и показывает, что данный «чукча» не читатель, а писатель, т.е. сам учебников по C++ и не открывал. Что значит «использование подходящего»? Конструктор производного класса всегда вызывает конструктор базового класса. А если конструктор производного класса не определен, то он генерируется компилятором.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 18:56 11
Цитата Сообщение от dicros Посмотреть сообщение
alsav22, а что посоветуете??
Советов тут может быть много, и у каждого свой. Я по Прата учил: "Язык Программирования C++. Лекции И Упражнения".
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
12.06.2014, 21:30  [ТС] 12
Цитата Сообщение от alsav22 Посмотреть сообщение
Советов тут может быть много, и у каждого свой
Согласен я примерно так и думал, спасибо всем откликнувшимся за помощь. Все же дочитаю эту книжку надеюсь больше косяков не будет а там если что в других нужные моменты уточню.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 21:43 13
Цитата Сообщение от dicros Посмотреть сообщение
надеюсь больше косяков не будет
Код из "Р.Лафоре. ООП в С++"
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.06.2014, 22:07 14
Цитата Сообщение от dicros Посмотреть сообщение
Все же дочитаю эту книжку
Безумству храбрых... Чувствуется, что вы не ищете легких путей! Взвейтесь соколы орлами!
0
New to C++
83 / 44 / 10
Регистрация: 14.01.2013
Сообщений: 258
12.06.2014, 22:21 15
dicros, Конечно же есть в книге пару неточностей, но именно с этой книги я начал изучение, и я остался доволен этой книгой. Так, что можно и по этой книге спокойно учить
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
13.06.2014, 02:00  [ТС] 16
Почитал я там дальше и вроде как стало более понятно, если я правильно понял то....


Конструкторы в наследуемом классе создаются для того чтобы вызвать соответствующий конструктор базового класса и инициализировать его значение. В данном случае инициализировать number


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
class A
{
protected:
    int number;
public:
    A() :number(0)      //конструктор без аргументов
    {};
 
    A(int n) :number(n)      //конструктор с одним аргументом
    {};
 
    void displ()const        //вывод значения на экран
    {
        cout << number << endl;
    };
};
 
 
class B : public A
{
public:
    B() :A()           //вызов конструктора без аргументов
    {};
 
    B(int x) :A(x)      //вызов конструктора с одним аргументом
    {};
 
    void increase()
    {
        ++number;
    };
};
 
int main()
{
 
    B t1;
    B t2(10);
 
    t1.displ();
    t2.displ();
 
    return 0;
};
Добавлено через 10 минут
Но с другой стороны зачем мучиться с конструкторами если того же результата можно добиться с помощью обычной функции.

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
class A
{
protected:
    int number;
public:
    A() :number(0)      //конструктор без аргументов
    {};
 
    void displ()const        //вывод значения на экран
    {
        cout << number << endl;
    };
};
 
class B : public A
{
public:
    void getZN(int x)
    {
        number=x;
    };
};
 
int main()
{
 
    B t1;
    B t2;
    t2.getZN(10);
 
    t1.displ();
    t2.displ();
 
    return 0;
};
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
13.06.2014, 02:21 17
dicros, обычную функцию можно забыть вызвать, а без конструктора объект не создашь.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
13.06.2014, 02:23 18
Но с другой стороны зачем мучиться с конструкторами если того же результата можно добиться с помощью обычной функции.
C++
1
2
B t2;
t2.getZN(10);
Или
C++
1
B t2(10);
Почувствуйте разницу. Плюс "с помощью обычной функции" нельзя будет объявить t2 как const.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.06.2014, 03:28 19
Цитата Сообщение от dicros Посмотреть сообщение
Но с другой стороны зачем мучиться с конструкторами если того же результата можно добиться с помощью обычной функции.
Ну вот Страуструп в своей книге как раз и объясняет почему "обычная функция" не годится. А объявлять данные protected это Лафоре рекомендует? Это нарушение инкапсуляции. Лазить своими функциями в чужие данные - это тоже нарушение инкапсуляции.
0
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
13.06.2014, 08:59  [ТС] 20
Цитата Сообщение от Mr.X Посмотреть сообщение
А объявлять данные protected это Лафоре рекомендует?
[]http://imgdisk.ru/images/DvwFj.jpg[/]
0
13.06.2014, 08:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2014, 08:59
Помогаю со студенческими работами здесь

Лафоре, преобразование классов
// times1.cpp // программа перевода времени в 24-часовом написании // в 12-часовое #include...

Не работает пример из книги Лафоре
Доброго времени суток! Взялся решать задачу из книги Лафоре, глава 9, упр. 2. Опробовал уже...

Пример из книги Лафоре. Подсчитать количество слов и символов в строке
#include &lt;iostream&gt; #include &lt;conio.h&gt; // для getche() using namespace std; int main() {...

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru