Наследование
.pdfОбъектно-ориентированное программирование
Наследование
Наследование
позволяет создать иерархические классификации
Позволяет создать базовый тип, который определяет характеристики, присущие множеству связанных элементов
Позволяет создать производные типы, которые включают все данные и методы базового типа
Формат наследования
class имя_производного класса : доступ имя базового класса
{
} |
public |
|
private |
||
|
||
|
protected |
Базовый класс
Производный класс
Наследование
Лампочка
-состояние
+Включить() +Выключить() +Проверить состояние()
public
Цветная лампочка
-цвет
+Установить цвет() +Узнать цвет()
Объект : Цветная лампочка
состояние
цвет
class Lamp{ bool state; public:
void TurnOn(); void TurnOff(); bool IsTurned(); };
class ColorLamp:public Lamp{ int color;
public:
void SetColor(int i){color=i;} int GetColor(){return color;} };
Общие правила порождения классов
количество базовых классов в списке порождения может быть любым;
один и тот же класс не может быть задан в списке порождения дважды
базовый класс должен быть определен
классы не могут быть определены как union
Цветная лампочка
using namespace std; |
char* color_lamp::getcolor(){ |
|
|
||
|
switch (color){ |
|
enum colors {black, green, blue, white, red}; |
case black:return "black"; |
|
|
case green:return "green"; |
|
class lamp{ |
case blue:return "blue"; |
|
case white:return "white"; |
||
bool state; |
||
case red:return "red"; |
||
public: |
||
default: return "error"; |
||
|
||
void TurnOn(){state=true;} |
} |
|
void TurnOff(){state=false;} |
} |
|
bool IsTurned(){return state;} |
int main() |
|
}; |
||
{ |
||
|
||
|
color_lamp l1; |
|
class color_lamp:public lamp{ |
l1.TurnOn(); |
|
colors color; |
l1.setcolor(blue); |
|
public: |
if (l1.IsTurned()){ |
|
cout<<"color - "<<l1.getcolor(); |
||
|
||
void setcolor(colors c){color=c;} |
l1.TurnOff(); |
|
cin.get(); |
||
|
||
char* getcolor(); |
return 0; |
|
}; |
} |
Область видимости компонента в производном классе
область видимости в базовом классе
cпособ определения производного класса (class/struct)
спецификация доступа в списке наследования
Область видимости компонента в производном классе
наследо- |
public |
private |
protected |
Доступ в списке |
|
|
|
вания |
|
|
|
Базовый класс |
|
|
|
|
|
|
|
public |
public |
private |
protected |
|
|
|
|
private |
закрыто в |
закрыто в |
закрыто в |
|
базовом |
базовом |
базовом |
|
классе |
классе |
классе |
|
|
|
|
protected protected |
private |
protected |
Пример 1 Наследование как public
#include <iostream> using namespace std;
class base { int i, j;
public:
void set(int a, int b) { i = a; j = b; }
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.set(1, 2);
obj.show();
obj.showk();
return 0;
}
Пример 2 Наследование protected данных
#include <iostream> |
int main() |
using namespace std; |
{ |
class base { |
derived obj; |
protected: |
obj.set(2, 3); |
int i, j; |
obj.show(); |
public: |
obj.setk(); |
void set(int a, int b) { i = a; j = b; } |
obj.showk(); |
void show() |
return 0; |
{ cout << i << " " << j << "\n"; } |
} |
}; |
|
class derived : public base { |
|
int k; |
|
public: |
|
void setk() { k = i*j; } |
|
void showk() { cout << k << "\n"; } |
|
}; |
|