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

Производные классы паблик и приват - C++

Восстановить пароль Регистрация
 
Пацан_
2 / 2 / 1
Регистрация: 22.05.2013
Сообщений: 39
12.07.2014, 14:12     Производные классы паблик и приват #1
Здравствуйте, нужна помощь. Это пример из книги Лафоре ООП С++. Не могу понять почему программа работает, хотя при наследовании классы student и employee объявлены как private. Ведь public методы getdata(), getedu() и putdata(), putedu() должны быть недоступны для объектов классов наследников. Как так?

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//empmult.cpp
//multiple inheritance with employees and degrees
#include <iostream>
using namespace std;
const int LEN = 80;           //maximum length of names
////////////////////////////////////////////////////////////////
class student                 //educational background
   {
   private:
      char school[LEN];       //name of school or university
      char degree[LEN];       //highest degree earned
   public:
      void getedu()
         {
         cout << "   Enter name of school or university: ";
         cin >> school;
         cout << "   Enter highest degree earned \n";
         cout << "   (Highschool, Bachelor's, Master's, PhD): ";
         cin >> degree;
         }
      void putedu() const
         {
         cout << "\n   School or university: " << school;
         cout << "\n   Highest degree earned: " << degree;
         }
   };
////////////////////////////////////////////////////////////////
class employee
   {
   private:
      char name[LEN];         //employee name
      unsigned long number;   //employee number
   public:
      void getdata()
         {
         cout << "\n   Enter last name: "; cin >> name;
         cout << "   Enter number: ";      cin >> number;
         }
      void putdata() const
         {
         cout << "\n   Name: " << name;
         cout << "\n   Number: " << number;
         }
   };
////////////////////////////////////////////////////////////////
class manager : private employee, private student  //management
   {
   private:
      char title[LEN];        //"vice-president" etc.
      double dues;            //golf club dues
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter title: ";          cin >> title;
         cout << "   Enter golf club dues: "; cin >> dues;
         student::getedu();
         }
      void putdata() const
         {
         employee::putdata();
         cout << "\n   Title: " << title;
         cout << "\n   Golf club dues: " << dues;
         student::putedu();
         }
   };
////////////////////////////////////////////////////////////////
class scientist : private employee, private student  //scientist
   {
   private:
      int pubs;     //number of publications
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter number of pubs: "; cin >> pubs;
         student::getedu();
         }
      void putdata() const
         {
         employee::putdata();
         cout << "\n   Number of publications: " << pubs;
         student::putedu();
         }
   };
////////////////////////////////////////////////////////////////
class laborer : public employee             //laborer
   {
   };
////////////////////////////////////////////////////////////////
int main()
   {
   manager m1;
   scientist s1, s2;
   laborer l1;
 
   cout << endl;
   cout << "\nEnter data for manager 1";    //get data for
   m1.getdata();                            //several employees
 
   cout << "\nEnter data for scientist 1";
   s1.getdata();
 
   cout << "\nEnter data for scientist 2";
   s2.getdata();
 
   cout << "\nEnter data for laborer 1";
   l1.getdata();
 
   cout << "\nData on manager 1";           //display data for
   m1.putdata();                            //several employees
 
   cout << "\nData on scientist 1";
   s1.putdata();
 
   cout << "\nData on scientist 2";
   s2.putdata();
 
   cout << "\nData on laborer 1";
   l1.putdata();
   cout << endl;
   return 0;
   }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2014, 14:12     Производные классы паблик и приват
Посмотрите здесь:

Создать производные классы C++
производные классы. C++
Абстрактные и производные классы C++
Наследование, базовые классы и производные классы C++
Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) C++
Абстрактные и производные классы С++ C++
C++ производные классы
C++ Производные классы

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
12.07.2014, 14:30     Производные классы паблик и приват #2
Цитата Сообщение от Пацан_ Посмотреть сообщение
Ведь public методы getdata(), getedu() и putdata(), putedu() должны быть недоступны для объектов классов наследников.
Нет, они доступны внутри наследника, но недоступны снаружи. Вот пример с различными наследованиями:

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
69
70
71
72
73
74
75
76
77
78
79
class Base
{
public:
    void public_method()
    {
 
    }
 
protected:
    void protected_method()
    {
 
    }
 
private:
    void private_method()
    {
 
    }
};
 
class PublicInheritance : public Base
{
public:
    PublicInheritance()
    {
        Base::public_method();
        Base::protected_method();
        // Base::private_method(); // private_method' is a private member of 'Base'
    }
};
 
class ProtectedInheritance : protected Base
{
public:
    ProtectedInheritance()
    {
        Base::public_method();
        Base::protected_method();
        // Base::private_method(); // private_method' is a private member of 'Base'
    }
};
 
class PrivateInheritance : private Base
{
public:
    PrivateInheritance()
    {
        Base::public_method();
        Base::protected_method();
        // Base::private_method(); // private_method' is a private member of 'Base'
    }
};
 
 
int main()
{
    Base b;
    b.public_method();
    // b.protected_method();    // 'protected_method' is a protected member of 'Base'
    // b.private_method();      // 'private_method'   is a private   member of 'Base'
 
    PublicInheritance pub;
    pub.public_method();
    // pub.protected_method();  // 'protected_method' is a protected member of 'Base'
    // pub.private_method();    // 'private_method'   is a private   member of 'Base'
 
    ProtectedInheritance prot;
    // prot.public_method();    // 'public_method'    is a protected member of 'Base', constrained by protected inheritance
    // prot.protected_method(); // 'protected_method' is a protected member of 'Base'
    // prot.private_method();   // 'private_method'   is a private   member of 'Base'
 
    PrivateInheritance priv;
    // priv.public_method();    // 'public_method'    is a private member of 'Base', constrained by private inheritance
    // priv.protected_method(); // 'protected_method' is a private member of 'Base', constrained by private inheritance
    // priv.private_method();   // 'private_method'   is a private member of 'Base'
 
    return 0;
}
А здесь есть таблички по уровням доступа при различных вариантах наследования
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.07.2014, 20:44     Производные классы паблик и приват #3
Цитата Сообщение от Пацан_ Посмотреть сообщение
хотя при наследовании классы student и employee объявлены как private
Такое наследование называется наследованием реализации. В противовес публичному наследованию, которое называют наследованием интерфейса.
В данном случае приватное наследование используется как альтернатива агрегации, т.е. представление базовых классов как полей производного.
Например, вместо
C++
1
class A : private B, private C {};
можно было бы написать:
C++
1
2
3
4
5
class A { 
private:
B b; 
C c 
};
Цитата Сообщение от Пацан_ Посмотреть сообщение
Ведь public методы getdata(), getedu() и putdata(), putedu() должны быть недоступны
Публичные методы, на то и публичные, чтобы быть доступны всегда и везде, иначе как вообще использовать объект в таком случае?
Yandex
Объявления
12.07.2014, 20:44     Производные классы паблик и приват
Ответ Создать тему
Опции темы

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