Наследование


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
Объектно
-
ориентированное
программирование

Наследование

Наследование


позволяет создать иерархические
классификации


Позволяет создать базовый тип, который
определяет характеристики, присущие
множеству связанных элементов


Позволяет создать производные типы,
которые включают все данные и методы
базового типа


Формат наследования

class

имя_производного
класса : доступ имя
базового класса

{

}

public

private

protected

Наследование

class Lamp{

bool state;

public:

void TurnOn();

void TurnOff();

bool IsTurned();

};


class ColorLamp:public Lamp{

int color;

public:





};


public

Общие правила порождения
классов


количество базовых классов в списке
порождения может быть любым;


один и тот же класс не может быть
задан в списке порождения дважды


базовый класс должен быть
определен


классы не могут быть определены как
union

Цветная лампочка

using namespace std;


enum

colors {black, green, blue, white, red};


class

lamp{


bool state;

public:


void TurnOn(){state=true;}


void TurnOff(){state=false;}


bool IsTurned(){return state;}

};


class

color_lamp:public lamp{


colors color;

public:




void setcolor(colors c){color=c;}


char* getcolor();

};


char*
color_lamp
::
(){

switch (color){



case

"black";



case

"green";



case
blue:return

"blue";



case
white:return

"white";



case
red:return

"red";



default: return "error";



}

}


int

main()

{

color_lamp

l1;


l1.TurnOn();




if (l1.IsTurned()){


cout
"color
-



l1.TurnOff();


cin.get
();

return 0;

}



Область видимости компонента в
производном классе


область видимости в базовом классе


c
пособ определения производного
класса (
class/struct
)


спецификация доступа в списке
наследования

Область видимости компонента в
производном классе

Доступ в списке
наследо
-

вания


Базовый класс

public


private


protected

public

public

private

protected

private

закрыто в
базовом
классе

закрыто в
базовом
классе

закрыто в
базовом
классе

protected

protected

private

protected

Пример 1 Наследование как
public

#include iostream&#xio4s;&#xt6re; m-4;

using namespace std;


class base {


int i, j;

public:




void show() { cout i " " j
"
\
n"; }

};

class derived : public base {


int k;

public:


derived(int x) { k = x; }


void showk() { cout k "
\
n"; }

};

int main()

{


derived obj(3);





obj.show();


obj.showk();





}


Пример 2

Наследование
protected

данных

#
include


iostream


using namespace std;

class base {

protected:


int i
,
j
;

public:




void show()


{ cout i " " j "
\
n"; }

};


class derived : public base {


int k;

public:




void showk() { cout k "
\
n"; }

};

int main()

{


derived obj;




obj.show();




obj.showk();



0;

}


Наследование нескольких
классов

class base1{


protected:

int x;

public:

void showx(){cout<\
n’;}

};


class base2{


protected:


int y;

public:

void showy(){cout<\
n’;}

};


class derived:public base1, public
base 2{

public:


};


int main(){

derived obj;


obj.showx();

obj.showy();



}

Примеры

class Class1{


int a1;

public:


int a2;

};


class Class2:protected Class1{


int b1;


protected:


int b2;

};

закрыто в
Class1

protected

Пример

class
classA
{

protected:

int

a;

};


class
classB
{

int

b1;

public:

int

b2;

};


class
classD:protected

classB
,
private
classA
{


int

d;

};

закрыто в

classB

protected

private

Пример

class Class1{

int

a1;

public:

int

a2;

};

class Class2:public Class1{

int

b1;

protected:

int

b2;

};

class Class4:public Class2{

protected:


int

c1;

};

Закрыто в
Class1

Закрыто в
Class 2

Перегрузка методов

#include iostreamios;&#xtr-3;-3a;&#x-4m-; 

using namespace std;


class student{


char name[20];


char group[10];

public:


void set();


void print();

};

void student::set(){


cout<<"Input name: “;

cin��name;


cout<<"Input group“;

cin��group;

}

void student::print()
{


cout"Sudent:
\
n";


cout"Second name: " name"
\
n group
-

"group'
\
n';

}

class post_student:public student{


char first_diploma[10];


char first_d_number[10];

public:


void set_diplomdata();


void print();

};


void
post_student
::
set_diplomdata
(){


cout
"Data from first diploma:
\
n";


cout
"
kvalification

-
";


cin
��
first_diploma
;


cout
"
diplome

number
-

";


cin
��
first_d_number
;

}

void
post_student
::print()
{


student::print();


cout
"Data for second education student
\
n ";


cout
"first diploma: "
first_diploma

endl
;


cout
" first diploma N "
first_d_number
'
\
n';

}

int

main()

{


post_student

st1;


st1.set();


st1.set_diplomdata();


st1.print();


();


cin.get
();


return 0;

}

Конструкторы

Вызываются в порядке происхождения классов.


конструктор_произоводного_класса(список
аргументов ):

base
1(список аргументов)

,
base
2(список аргументов),…,

baseN
(список аргументов)

{

//Тело конструктора производного класса

}


Пример. Конструкторы

#include
iostream



using namespace std;


class base {


protected:


int

i
;


public:



base(
int

x) {
i

= x;
cout


"Constructing base
\
n"; }



~base() {
cout

"Destructing base
\
n";
}

};


class derived: public base {


int

j;

public:


derived(
int

x,
int

y): base(y)


{ j = x;
cout

"Constructing
derived
\
n"; }


~derived() {
cout

"Destructing
derived
\
n"; }


void show() {
cout


i

" " j
"
\
n"; }

};


int

main()

{


derived ob(3, 4);


ob.show
();



}


Деструкторы


Вызываются в обратном порядке,
сначала вызывается деструктор
класса, определяющего тип
объектной переменной, а затем


деструктор базового класса, и т.д.

Преимущества наследования


Возможность повторного использования кода;


Возможность отразить взаимоотношения объектов,
свойственные предметной области;


Возможность рассматривать производный класс как подкласс
базового, упрощая реализацию кода для производного класса;


Возможность обработки производных классов методами,
разработанными при проектировании базового класса;


Возможность обновления или изменения содержания этих
методов применительно к объектам производного класса, если
такая необходимость имеется.

MFC


Приложенные файлы

  • pdf 1073504
    Размер файла: 745 kB Загрузок: 0

Добавить комментарий