Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

Общее и частное наследование. Комбинации доступа

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

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

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

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

protected:

int protdataA;

public:

int pubdataA;

};

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

class B : public A { // производный класс (общий наследник класса А)

public:

void funct ( ) {

int a;

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

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

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

}

};

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

class C : private A { // производный класс (частный наследник класса А)

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; // так можно

С objC;

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

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

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

return 0;

}

Здесь, ещё раз показано, что методы производных классов имеют доступ к данным базового класса, объявленным как public или protected. Для объектов производных классов нет доступа к членам базового класса, объявленным как protected или private. Если объекты производных классов не пользуются методами базовых классов, то в этом случае нет надобности использовать общее наследование.

Производные классы могут являться базовыми классами для других производных классов:

class A

{ };

class B : public A // производный класса А

{ };

class C : public B { }; // производный класса В

Вопрос

Допустим, что в предыдущей программе о служащих необходимо добавить производный класс Master от класса Worker, который имел-бы дополнителное поле "стаж".

int main() {

Master mr("Krotov I.I.", 111, 1, 20);

cout << "\nVyvod masterov: "; mr.show();

}

Ответ

class Master : public Worker {

private:

int stag;

public:

Master() : Worker() { }

Master(char *mname, int mnum, int mr, int s) : Worker(mname, mnum, mr) {

stag = s;

}

void getdata() {

Worker::getdata();

cout << " Vvedite stag: "; cin >> stag;

}

void show() const {

Worker::show();

cout << "\n Stag: " << stag;

}

};