Наследование в С++. Правила наследования методов. Виртуальные методы

Страницы работы

Фрагмент текста работы

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

Наиболее значимой после классов возможностью ООП является наследование. Это процесс создания новых классов, называемых наследниками или производными классами, из уже существующих или базовых классов. Производный класс получает все возможности базового класса, но может также быть усовершенствован за счёт добавления собственных. Базовый класс при этом остаётся неизменным.

Наследование обеспечивает:

1)  повторное использование кода, что упрощает распространение библиотек классов;

2)  помощь при начальной постановке задачи программирования, разработке общей структуры программы .

Наследование позволяет объединить общие для нескольких классов свойства (элементы) в одном классе и использовать его в качестве базового.

Простым называется наследование, при котором производный класс имеет одного родителя.

Множественное наследование позволяет одному классу обладать свойствами двух и более родительских классов.

Для различных методов класса существуют разные правила наследования – например, конструкторы и операция присваивания в производном классе не наследуются.

Рассмотрим наследование классов и проблемы, возникающие при этом на примере.

Млекопитающее

Название

Вес

Цвет

Мышь

Кол-во зубов

Длина хвоста

Слон

Длина хобота

Пример нашей программы начинается с описания базового класса mammal, содержащего основные характеристики любого млекопитающего. Производные классы mouse иelephantсодержат специальную информацию об этих животных.

#include <iostream>

using namespace std;

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

{

protected:

int weight;

int color;

private:

char *name;

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

public: mammal():weight(1), color(1),name(0)

{}

mammal(char* n, int w, int c);

//Деструктор

~mammal(){delete [] name;}

// Операции

mammal& operator ++(){

++color; return *this;

}

mammal operator ++(int){

mammal M(*this);

color++;

return M;

}

bool operator >(mammal &M){

if(weight > M.weight) return true;

return false;

}

const mammal& operator =(mammal &M){

if(&M= =this) return *this;

if (name)delete [] name;

if (M.name){

name=new char[strlen(M.name)+1];

strcpy(name,M.name);}

else name=0;

weight=M.weight; color=M.color;

return *this;

}

//Функции  доступа к полям

int get_weight()const {return weight;}

int get_color()const {return color;}

char * get_name() const {

if (name) return name;   }

void draw();

void feed();

void play(int);

};

// Реализация класса mammal

mammal::mammal(char* n, int w, int c):{

name=new char[strlen(n)+1];

strcpy(name,n);

weight=w;

color=c;}

void mammal::draw(){

//Отрисовка mammal;}

void mammal::feed(){

//Питание mammal;}

void mammal:: move(int k){

//Движение mammal;}

//--------Класс mouse

class mouse: public mammal //производный класс

{

int teeth;

int tail_len;

public: mouse();

mouse(char *s, int w, int c, int t1,int t2): mammal(s,w,c)/*Вызов конструктора с параметрами базового класса*/

{ tail_len=t1;

teeth=t2;

}

~mouse();

//Операции

const mouse& operator =(mouse &M){

if (&M= = this) return *this;

teeth=M.teeth;

tail_len=M.tail_len;

mammal::operator=(M);/*вызов функции-операции присваивания из базового класса. Имя функции-операции здесь: operator=()

return *this;

void draw();

void move();

void f();

};

void mouse:: draw()

{//Отрисовка mouse }

//---------- Реализация прочих методов---// -------Класс elephant

class elephant: public mammal// производный класс

{

int trunc_len;

public:

//------------};

При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Если базовых классов несколько, они перечисляются через запятую. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, public иprotected:

class имя:[ private| public| protected]базовый_ класс

{тело класса};

Например,

class A{…};

class B{…};

class C{…};

class D:A, protected B, public C

{…};

По умолчанию для классов используется ключ доступа private.

1.  Спецификатор доступа protected.

До сих пор мы рассматривали применяемые к элементам класса спецификаторы доступа privateи public. Для любого элемента класса может также использоваться спецификатор protected, который для одиночных классов, не входящих в иерархию, равносилен private. Разница между ними проявляется при наследовании, что можно видеть  из приведённой таблицы:

Ключ доступа

Спецификатор в базовом классе

Доступ в производном классе

private

private

protected

public

нет

private

private

protected

private

protected

public

нет

protected

protected

public

private

protected

public

нет

protected

public

Из таблицы видно,  что privateэлементы базового класса в производном классе недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.

Элементы protected при наследовании с ключом private становятся в производном классе private, в остальных случаях права доступа к ним не меняются.

Доступ к элементам public при наследовании становится соответствующим ключу доступа.

Итак, методы производного класса имеют доступ к членам базового класса, если они имеют спецификатор доступа public или  protected. К членам, объявленным как private доступа нет. Член, объявленный как protected, доступен методам своего класса и методам любого производного класса. При этом, в отличие от члена public, он не будет доступен из функций, не принадлежащих этим классам, например из функции main().

2.  Правила наследования методов

205


В классе mouse введены поля teethtail_len и функция  f, определены

Похожие материалы

Информация о работе