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

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

Восстановить пароль Регистрация
 
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
12.06.2014, 01:04     Наследование классов: неудачный пример из Лафоре #1
И снова всем доброй ночи . Начал читать про наследование классов и совсем запутался может быть вы мне растолкуете в чем ошибка и чего я не понял. Вот пример:

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 у меня определен конструктор с одним параметром но он им почему то не пользуется.



В чем проблема??? подскажите пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2014, 01:04     Наследование классов: неудачный пример из Лафоре
Посмотрите здесь:

Наследование классов. Копирование производных классов C++
Пример из книги Лафоре C++
C++ Пример из книги Лафоре
Непонятен пример из Лафоре C++
C++ Лафоре, преобразование классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
12.06.2014, 01:44     Наследование классов: неудачный пример из Лафоре #2
Проблема в "учебнике", который нужно немедленно выбросить и заменить на толковый. А что за "учебник" такой?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 02:11     Наследование классов: неудачный пример из Лафоре #3
Цитата Сообщение от dicros Посмотреть сообщение
Создадим объект класса tes в функции main()
tes t1;
Эта строка означает, что t1 будет создан как объект класса tes и инициализирован нулем. Но в классе tes нет конструктора, каким же образом выполняется инициализация? Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса. В test конструктор класса tes отсутствует, и компилятор использует конструктор класса test без аргументов.
Чушь какая-то написана. Если можно, название книги и страницу.
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
12.06.2014, 02:53  [ТС]     Наследование классов: неудачный пример из Лафоре #4
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.

стр. 363
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,956
12.06.2014, 03:12     Наследование классов: неудачный пример из Лафоре #5
Оказывается, что если мы не определили конструктор производного класса, то будет использоваться подходящий конструктор базового класса.
Если мы не определили конструктор производного класса, то для базового класса будет вызван конструктор по умолчанию (без аргументов). И для полей производного класса будет вызван конструктор по умолчанию. А если их нет, то ничего не скомпилируется.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 03:19     Наследование классов: неудачный пример из Лафоре #6
Цитата Сообщение от dicros Посмотреть сообщение
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.
стр. 363
Что тут скажешь... Можно списать на неудачный перевод.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
12.06.2014, 09:34     Наследование классов: неудачный пример из Лафоре #7
Цитата Сообщение от dicros Посмотреть сообщение
Р. Лафоре "Объектно-ориентированное программирование в С++" 4-е издание.
Блин! Я так и думал. Я уже покритиковал этого «автора», но товарищ, который его мучает, написал, что конечно, но зато он «бу-бу-бу». Оказывается ни хрена не «бу-бу-бу», и бракодел в одном бракодел во всем.
Цитата Сообщение от alsav22 Посмотреть сообщение
Чушь какая-то написана.
Однако ж пишут, что эта чушь офигенно популярна среди американских студентов, причем настолько, что надо было ее четыре раза переиздавать, да еще и на русский переводить эту галиматью. Мда, дофига есть на свете, друг Горацио…
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
12.06.2014, 09:43  [ТС]     Наследование классов: неудачный пример из Лафоре #8
Mr.X, alsav22, а что посоветуете?? какой учебник скачать только чтобы он был для начинающих.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.06.2014, 10:52     Наследование классов: неудачный пример из Лафоре #9
Ради интереса решил посмотреть, что же пишет этот Лафоре. Для сравнения привожу оригинал и перевод.
Перевод в данном случае можно назвать адекватным, а вот саму идею использования "подходящего" конструктора из базового класса не стоит распространять на конструкторы с параметрами. У автора в примере указывается именно конструктор по умолчанию. Но сформулировано так, что и для других констукторов будут работать аналогичные правила, что, конечно, не соответствует действительности.
P.S. Оригинал книги издан в 2002 году, новых книг автор не писал (а жив ли он ещё?). Не знаю насколько в целом она хороша для начинающего, но учитывая некоторые неоднозначные формулировки автора и древность книги, стоит рассмотреть другие варианты. См. список литературы.
Миниатюры
Наследование классов: неудачный пример из Лафоре   Наследование классов: неудачный пример из Лафоре  
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
12.06.2014, 11:28     Наследование классов: неудачный пример из Лафоре #10
Цитата Сообщение от Tulosba Посмотреть сообщение
а вот саму идею использования "подходящего" конструктора из базового класса не стоит распространять на конструкторы с параметрами.
Ну так сама идея-то бредовая, и показывает, что данный «чукча» не читатель, а писатель, т.е. сам учебников по C++ и не открывал. Что значит «использование подходящего»? Конструктор производного класса всегда вызывает конструктор базового класса. А если конструктор производного класса не определен, то он генерируется компилятором.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 18:56     Наследование классов: неудачный пример из Лафоре #11
Цитата Сообщение от dicros Посмотреть сообщение
alsav22, а что посоветуете??
Советов тут может быть много, и у каждого свой. Я по Прата учил: "Язык Программирования C++. Лекции И Упражнения".
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
12.06.2014, 21:30  [ТС]     Наследование классов: неудачный пример из Лафоре #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Советов тут может быть много, и у каждого свой
Согласен я примерно так и думал, спасибо всем откликнувшимся за помощь. Все же дочитаю эту книжку надеюсь больше косяков не будет а там если что в других нужные моменты уточню.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.06.2014, 21:43     Наследование классов: неудачный пример из Лафоре #13
Цитата Сообщение от dicros Посмотреть сообщение
надеюсь больше косяков не будет
Код из "Р.Лафоре. ООП в С++"
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
12.06.2014, 22:07     Наследование классов: неудачный пример из Лафоре #14
Цитата Сообщение от dicros Посмотреть сообщение
Все же дочитаю эту книжку
Безумству храбрых... Чувствуется, что вы не ищете легких путей! Взвейтесь соколы орлами!
Progers
New to C++
 Аватар для Progers
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
12.06.2014, 22:21     Наследование классов: неудачный пример из Лафоре #15
dicros, Конечно же есть в книге пару неточностей, но именно с этой книги я начал изучение, и я остался доволен этой книгой. Так, что можно и по этой книге спокойно учить
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
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;
};
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
13.06.2014, 02:21     Наследование классов: неудачный пример из Лафоре #17
dicros, обычную функцию можно забыть вызвать, а без конструктора объект не создашь.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,956
13.06.2014, 02:23     Наследование классов: неудачный пример из Лафоре #18
Но с другой стороны зачем мучиться с конструкторами если того же результата можно добиться с помощью обычной функции.
C++
1
2
B t2;
t2.getZN(10);
Или
C++
1
B t2(10);
Почувствуйте разницу. Плюс "с помощью обычной функции" нельзя будет объявить t2 как const.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
13.06.2014, 03:28     Наследование классов: неудачный пример из Лафоре #19
Цитата Сообщение от dicros Посмотреть сообщение
Но с другой стороны зачем мучиться с конструкторами если того же результата можно добиться с помощью обычной функции.
Ну вот Страуструп в своей книге как раз и объясняет почему "обычная функция" не годится. А объявлять данные protected это Лафоре рекомендует? Это нарушение инкапсуляции. Лазить своими функциями в чужие данные - это тоже нарушение инкапсуляции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 08:59     Наследование классов: неудачный пример из Лафоре
Еще ссылки по теме:

C++ Заменить наследование классов на наследование интерфейсов
C++ Лафоре Не компилируется пример
C++ Пример из книги Лафоре. Подсчитать количество слов и символов в строке

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

Или воспользуйтесь поиском по форуму:
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
13.06.2014, 08:59  [ТС]     Наследование классов: неудачный пример из Лафоре #20
Цитата Сообщение от Mr.X Посмотреть сообщение
А объявлять данные protected это Лафоре рекомендует?
[]http://imgdisk.ru/images/DvwFj.jpg[/]
Yandex
Объявления
13.06.2014, 08:59     Наследование классов: неудачный пример из Лафоре
Ответ Создать тему
Опции темы

Текущее время: 00:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru