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

Множественное наследование - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
piligrim622
 Аватар для piligrim622
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 4
28.10.2011, 05:06     Множественное наследование #1
Здравствуйте, всем!

Я на этом форуме впервые. Пытаюсь изучать С++ самостоятельно.
Литература некоторая имеется. Начал изучение с "С++ для чайников" 5-е издание Стефана Р. Дэвиса. Это самоучитель. Вот решил пока не дойду до конца(не изучу) на следующий шаг в изучении С++ переходить не буду.
Вот уже дошел почти до конца. Глава 26 "Множественное наследование".
И вот здесь появились вопросы на которые я хотел бы получить ответ если можно. Т.к. в этой книге на них ответов нет.

По представленным ниже ссылкам пожалуйста перейдите на рисунки на которых представлен код на С++ из этого самоучителя и если не затруднитответьте на такой вопрос:
Множественное наследованиеМножественное наследование

Для чего наследовать в этом примере классы Bed и Sofa классу SleeperSofa если потом через объект ss я не могу обратиться к открытым членам этих классов кроме ss.weight? Более того я не могу даже обратиться к ф-ции foldOut() наследующего класса?

 Комментарий модератора 
Прикрепляйте изображения к своим сообщениям
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2011, 05:06     Множественное наследование
Посмотрите здесь:

Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
Множественное наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
28.10.2011, 08:33     Множественное наследование #2
Цитата Сообщение от piligrim622 Посмотреть сообщение
я не могу обратиться к открытым членам этих классов
можешь
Цитата Сообщение от piligrim622 Посмотреть сообщение
я не могу даже обратиться к ф-ции foldOut() наследующего класса
можешь
fasked
28.10.2011, 09:53
  #3

Не по теме:

Цитата Сообщение от piligrim622 Посмотреть сообщение
И вот здесь появились вопросы на которые я хотел бы получить ответ если можно. Т.к. в этой книге на них ответов нет.
Это повод выкинуть книгу.

silent_1991
28.10.2011, 12:09
  #4

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Это повод выкинуть книгу.
Повод был раньше, когда нам доступ к весу открыли. Т.е. если я хочу кровать-самолёт, я могу задать отрицательный вес и не париться с турбинами (это пояснение тем, кто скажет, что это всё ерунда и предрассудки, и вообще в std:: pair данные открыты).

fasked
28.10.2011, 13:56
  #5

Не по теме:

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

piligrim622
 Аватар для piligrim622
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 4
29.10.2011, 15:46  [ТС]     Множественное наследование #6
Прикрепляйте изображения к своим сообщениям
Постараюсь!

Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:


Это повод выкинуть книгу.

Добавлено через 20 минут
Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:


Стоит также отметить, что по-умолчанию вес любой мебели нулевой. Мечта для грузчика.

Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:


Повод был раньше, когда нам доступ к весу открыли. Т.е. если я хочу кровать-самолёт, я могу задать отрицательный вес и не париться с турбинами (это пояснение тем, кто скажет, что это всё ерунда и предрассудки, и вообще в std:: pair данные открыты).


Ребят, я понимаю вашу иронию насчет книги и всё такое, но как быть с прилагаемым к этой книге компилятором Dev C++, который останавливается именно на этих строках(ну когда я обращаюсь в main() к открытым функциям-членам классов Bed, Sofa и SleeperSofa через объект ss класса SleeperSofa)помимо конечно ss.weight(). Хотя слышал про этот компилятор много лестных слов.
Может, что-то автор не так объяснил, или есть какие то мне неведомые настройки компилятора?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.10.2011, 16:53     Множественное наследование #7
piligrim622, вы можете выложить сюда код (не в виде картинки, в виде текста), который у вас не компилируется, и указать конкретно строки, на которых спотыкается компилятор? Или стесняетесь?
piligrim622
 Аватар для piligrim622
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 4
30.10.2011, 16:59  [ТС]     Множественное наследование #8
Ок-Ок! Попробую.

Добавлено через 29 минут
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
56
57
58
59
60
61
62
63
64
65
66
67
68
//
//  VirtualInheritance - using virtual inheritance the
//             Bed and Sofa classes can share a common base
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
 
// Furniture - more fundamental concept; this class
//             has "weight" as a property
class Furniture
{
  public:
    Furniture(int w = 0) : weight(w) {}
    int weight;
};
 
class Bed : virtual public Furniture
{
  public:
    Bed() {}
    void sleep(){ cout << "Sleep" << endl; }
};
 
class Sofa : virtual public Furniture
{
  public:
    Sofa(){}
    void watchTV(){ cout << "Watch TV" << endl; }
};
 
// SleeperSofa - is both a Bed and a Sofa
class SleeperSofa : public Bed, public Sofa
{
  public:
    SleeperSofa(int weight) : Furniture(weight) {}
    void foldOut(){ cout << "Fold out" << endl; }
};
 
int main(int nNumberofArgs, char* pszArgs[])
{
    SleeperSofa ss(10);
    
    // Section 1 -
    // the following is no longer ambiguous;
    // there's only one weight shared between Sofa and Bed
    // Furniture::Sofa or a Furniture::Bed?
    cout << "Weight = "
         << ss.weight
         << ss.foldOut()
         << endl;
 
    // Section 2 -
    // the following specifies the inheritance path
    // unambiguously - sort of ruins the effect
    SleeperSofa* pSS = &ss;
    Sofa* pSofa = (Sofa*)pSS;
    Furniture* pFurniture = (Furniture*)pSofa;
    cout << "Weight = "
         << pFurniture->weight
         << endl;
 
    // wait until user is ready before terminating program
    // to allow the user to see the program results
    system("PAUSE");
    return 0;
}
Вот как раз на строке 51 он и спотыкается. Ребят, я по ходу изучения данной книжки находил у автора небольшие косяки,
и в них ещё мог разобраться. А вот здесь, что-то никак. Судя по прочитанному для этой главы никаких проблем не должно быть на этой строке???
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
30.10.2011, 17:07     Множественное наследование #9
кто-то наверно скажет по-другому, но наверно надо перегрузить оператор <<
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:09     Множественное наследование #10
amor1k, Незачем.
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
30.10.2011, 17:10     Множественное наследование #11
кто-то наверно скажет по-другому
я же говорю)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:11     Множественное наследование #12
amor1k, Прежде чем что-то говорить лучше обосновать почему стоит сделать именно так. Почему вы считаете что нужно перегрузить оператор вывода в поток?
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
30.10.2011, 19:40     Множественное наследование #13
piligrim622, попробуйте вместо
C++
1
2
3
4
   cout << "Weight = "
         << ss.weight
         << ss.foldOut()
         << endl;
сделать
C++
1
2
3
4
   cout << "Weight = "
         << ss.weight
         << endl;
        ss.foldOut()
Haster
инженер-системотехник
 Аватар для Haster
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
30.10.2011, 19:52     Множественное наследование #14
Ну тут явный косяк, по моему, т.е. методу cout передается функция, которая ничего не возвращает для вывода, а внутри нее используется свой оператор вывода cout.
Попробуйте так:
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
56
57
58
59
60
61
62
63
64
65
66
67
//
//  VirtualInheritance - using virtual inheritance the
//             Bed and Sofa classes can share a common base
//
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
 
// Furniture - more fundamental concept; this class
//             has "weight" as a property
class Furniture
{
  public:
    Furniture(int w = 0) : weight(w) {}
    int weight;
};
 
class Bed : virtual public Furniture
{
  public:
    Bed() {}
    void sleep(){ cout << "Sleep" << endl; }
};
 
class Sofa : virtual public Furniture
{
  public:
    Sofa(){}
    void watchTV(){ cout << "Watch TV" << endl; }
};
 
// SleeperSofa - is both a Bed and a Sofa
class SleeperSofa : public Bed, public Sofa
{
  public:
    SleeperSofa(int weight) : Furniture(weight) {}
    void foldOut(){ cout << "Fold out" << endl; }
};
 
int main(int nNumberofArgs, char* pszArgs[])
{
    SleeperSofa ss(10);
    
    // Section 1 -
    // the following is no longer ambiguous;
    // there's only one weight shared between Sofa and Bed
    // Furniture::Sofa or a Furniture::Bed?
    cout << "Weight = "
         << ss.weight<<endl;
         ss.foldOut(); // ТУТ ВЫЗЫВАЕМ ФУНКЦИЮ
 
    // Section 2 -
    // the following specifies the inheritance path
    // unambiguously - sort of ruins the effect
    SleeperSofa* pSS = &ss;
    Sofa* pSofa = (Sofa*)pSS;
    Furniture* pFurniture = (Furniture*)pSofa;
    cout << "Weight = "
         << pFurniture->weight
         << endl;
 
    // wait until user is ready before terminating program
    // to allow the user to see the program results
    system("PAUSE");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2011, 02:28     Множественное наследование
Еще ссылки по теме:

C++ множественное наследование
C++ множественное наследование
Множественное наследование C++

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

Или воспользуйтесь поиском по форуму:
piligrim622
 Аватар для piligrim622
0 / 0 / 0
Регистрация: 28.10.2011
Сообщений: 4
31.10.2011, 02:28  [ТС]     Множественное наследование #15
aeshes,
Haster,

Спасибо за объяснение. Что-то сам я не допёр то этого! Ещё раз спасибо и удачи!
Yandex
Объявления
31.10.2011, 02:28     Множественное наследование
Ответ Создать тему
Опции темы

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