ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн

Комбинации доступа

Существует очень много возможностей для доступа, и полезно будет изучить программу примера, показывающую, какая комбинация будет работать, а какая нет. Рассмотрим листинг программы PUBPRIV:

// pubpriv.cpp

// испытание классов наследованных как public и private

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

class A                // базовый класс

{

  private:             // тип доступа к данным совпадает с типом

    int privdataA;     // доступа к функциям

  protected:

    int protdataA;

  public:

    int pubdataA;

};

///////////////////////////////////////////////////////////

class B : public A     // public наследование

{

  public:

    void funct ( )

      {

 

int a;

        a = privdataA; // ошибка, нет доступа

        a = protdataA; // так можно

        a = pubdataA;  // так можно

      }

};

///////////////////////////////////////////////////////////

class C : private A    // private наследование

{

  public:

    void funct ( )

      {

        int a;

        a = privdataA; // ошибка, нет доступа

        a = protdataA; // так можно

        a = pubdataA;  // так можно

      }

};

///////////////////////////////////////////////////////////

int main ( )

{

  int a;

  B objB;

  a = objB.privdataA;  // ошибка, нет доступа

  a = objB.protdataA;  // ошибка, нет доступа

  a = objB.pubdataA;   // так можно

 

  C objC;

  a = objC.privdataA;  // ошибка, нет доступа

  a = objC.protdataA;  // ошибка, нет доступа

  a = objC.pubdataA;   // ошибка, нет доступа

 

  return 0;

}

В программе описан класс A, имеющий данные со спецификаторами доступа private, public и protected. Классы В и C являются производными классами. Класс В является общим наследником, а класс C — частным наследником от класса A.

Как мы видели ранее, методы производных классов имеют доступ к данным базового класса, объявленным как public или protected. Для объектов производ- ных классов нет доступа к членам базового класса, объявленным как protected или private.

Что нового в различиях между общими и частными производным и классами? Объекты общего наследника класса B имеют доступ к членам класса A, объяв- ленным как public или protected, а объекты частного наследника класса C имеют доступ только к членам, объявленным как public. Это показано на рис. 9.7.

Если не указывать спецификатор доступа при создании класса, то будет ис- пользован спецификатор private.

 

26