
Void main ( )
{
derived obj;
ob.set_x(10);
ob.set_y(12);
ob.show_x( );
ob.show_y( );
}
В данном примере класс base наследуется как открытый. Поэтому в объекте obj, который является экземпляром производного класса, его public- функции доступны как обычные открытые члены. Но “добраться” напрямую до закрытого члена базового класса всё также невозможно; и инструкция типа
cout <<obj.x; // Неверно!
будет ошибкой.
В следующем примере наследование производится с типом private. В этом случае открытые члены базового класса в производном становятся закрытыми. Рассмотрим, как в этом случае получить доступ и к открытым и к закрытым членам базового класса через производный.
# include <iostream.h>
class chief
{ int a;
public:
void set_a (int n) {a=n;}
Int get_a( ) {return a;}
};
class clerk: private chief
{ int b;
public:
void set_ab (int n, int m) {set_a(n);b=m;}
void show_b( ) {cout <<b<<’\n’;}
void show_a( ) {cout <<get a( )<<’\n’;}
};
Void main( )
{clerk.obj;
obj.set_ab(2500,500);
obj.show_b( );
obj.show_a( );
}
Т.к. при наследовании с типом private получить доступ к “наследству” можно только через открытые члены “наследника”, то в классе clerk проектируется функция для ввода значения закрытой переменной “a” базового класса и вторая функция – для вывода этого значения на экран. Однако доступ к “a” возможен только через открытые члены базового класса, которые и выступают в этих функциях в качестве посредников.
Защищенные члены классов.
ИЧлены класса
з вышеизложенного все больше
проступает неудобство работы с закрытыми
членами базового класса в производном
классе. Чтобы допустить членов производного
класса к общению с private-членами
базового класса, введен спецификатор
доступа protected
(защищенный).
Т
}
закрытые члены
еперь
члены класса разделены на три группы:
private, protected и public. Спецификатор protected
может располагаться в любом месте
описания класса, но обычно он располагается
перед public . И это оправдано, потому что
protected-члены – это часть закрытых членов
базового класса, к которым напрямую
могут обращаться члены производных
классов.
Правила наследования защищенных членов классов
П
равила
наследования:
1. Когда базовый класс наследуется производным как public, защищенные члены базового класса становятся защищенными членами производного класса.
2
.Когда
базовый класс наследуется как закрытый,
то защищенные члены базового становятся
private-членами производного (аналогично
и public-члены).
3.Если базовый класс наследуется как защищенный, то открытые и защищенные члены базового класса наследуются как protected.
#include <iostream.h>
class base
{ int a;
protected:
int b;
public:
void set_ab (int n, int m) {a=n; b=m;}
void show_a( ) {cout<<a<<’ ’;}
};
class derived: protected base
{int c;
public:
void set_c (int k) {c=k;}
void show_bc( ){cout<<b<<’ ‘<<c<<’\n’;}
};
Void main( )
{derived ob;
//ob.set_ab(1,2); //ОШИБКА! set_ab( ) стала закрытым членом derived
ob.set_c(3);
//ob.show_a( ); //ОШИБКА! (аналогичная)
ob.show_bc( )
}
В этом примере базовый класс наследуется как защищенный. В базовом классе недоступной останется переменная «а». Чтобы вывести ее значение предусмотрена public-функция. Члены base при наследовании переходят в категорию protected (кроме «а»), поэтому напрямую недоступны. Из-за этого ошибки в программе.
Технология использования конструкторов в наследовании.
Если у базового и производного классов имеются конструкторы и деструкторы, то конструктор базового класса выполняется раньше конструктора производного; для деструкторов соблюдается обратный порядок. Если конструкторы имеют параметры, то:
а) все аргументы для конструктора базового и конструктора производного классов передаются конструктору производного класса;
б) затем, используя расширенную форму объявления конструктора производного класса, соответствующие аргументы передаются в базовый класс.
# include <iostream.h>
class base
{int i;
public:
base(int n) {cout <<”Base constructor”; i=n;}
~base ( ) {cout<<”Base destructor”;}
void show_i( ) {cout <<i<<`\n';}
};
class derived : public base
{ int j;
public:
derived(int n, int m): base(m)
{cout<<”Derived constructor”; j=n;}
~derived( ) {cout<<”Derived destructor”;}
void show_j( ) {cout<<j<<’\n’;}
};