Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Что такое наследование и переопределение?




Наследование— еще одна важная составляющая объектно-ориентированного программирования. Благодаря ему производныеклассы наследуют функциональность базовыхи добавляют к ней свои собственные возможности. Например, мы можем создать базовый класс vehicle(транспортное средство) и породить от него два производных класса: truck(грузовик) и helicopter(вертолет). Оба имеют один и тот же базовый класс (и содержат все методы базового класса), что экономит время при программировании.

Хотя классы helicopter и truck порождаются от одного и того же базового класса vehicle, каждый из них по-своему модифицирует его поведение, так что в итоге мы получаем два вполне самостоятельных класса.

ПОДСКАЗКА: Помните об отличиях между модификаторами доступа private, protected и public. К открытым (public) членам класса можно обращаться из любого места программы, к закрытым (private) - только из объектов того же класса, а к защищенным (protected) — из объектов того же самого или производных от него классов.

Оба производных класса могут пользоваться методами vehicle, например, start()(завести) илиmove()(двигаться). Однако вертолет движется иначе, чем грузовик. Как дополнить или даже изменить поведение класса vehicle, чтобы приспособить его для новых классов? Одна из возможностей заключается в переопределении, методов базового класса (переопределение методов считается важной составляющей объектно-ориентированного программирования). Когда мы переопределяем метод базового класса в производном классе, новая версия метода полностью заменяет старую. Таким образом, мы можем изменить поведение базового класса в производном классе и заставить его вести себя так, как нам нужно.

 Давайте посмотрим, как наследование и переопределение применяются на практике. Создайте новый проект с именем Inheritance. Объявим класс транспортного средства vehicleс двумя методами, start()и move():

#include <lostream.h>

class vehicle {

        public: void start();

         void move();

};

Метод start() класса vehicle в нашем примере будет просто выводить строку "Starting...", а метод move() — строку "Driving...":

#include <lostream.h>

class vehicle {

        public: void start();

         void move();

};

void vehicle: :start() { cout << "Starting.. .\n";}

void vehicle::move() { cout<<"Driving...\n";}

Теперь создадим новый класс helicopterи сделаем его производным от класса vehicle.

Создание производного класса

Класс helicopter порождается от базового класса vehicle так:

#include <lostream.h>

class vehicle {

        public: void start();

         void move();

};

class helicopter: public vehicle {

public: void move();

 };

void vehicle: :start() { cout << "Starting.. .\n";}

void vehicle::move() { cout<<"Driving...\n";}

Чтобы сделать класс helicopter производным от класса vehicle, следует после объявления класса helicopter поставить двоеточие и указать имя базового класса

Поскольку класс helicopter является производным от vehicle, он изначально содержит методы класса vehicle: start() и move().

Изменение метода — переопределение

Однако метод move() класса vehicle выводит строку "Driving..." (то есть "Еду..."), что для вертолета это не подходит. Следовательно, мы должны переопределить метод move() в классе helicopter так, чтобы он выводил строку "Flying..." (то есть "лечу..."):

#include <lostream.h>

class vehicle {

        public: void start();

         void move();

};

class helicopter : public vehicle {

public:

void move();

 };

void vehicle::start() { cout << "Starting.. .\n";}

void vehicle::move() { cout<<"Driving...\n";}

void helicopter: move() { cout<< "Flying...\n";}

Методы start() и niove() класса helicopter можно свободно вызывать в функции

#include <lostream.h>

class vehicle {

        public: void start();

         void move();

};

class helicopter : public vehicle {

 public:

void move();

};

void vehicle: :start() { cout << "Starting.. .\n";}

void vehicle::move() { cout<<"Driving...\n";}

void helicopter::move() { cout<< "Flying...\n";}

Void main()

 {

        helicopter whirly;

        whirly.start();

        whirly.move();

}

Переопределенный метод move() успешно работает и выводит строку "Flying..." вместо "Driving...". В этой программе мы познакомились с техникой наследования и переопределения методов в C++.

Нам осталось рассмотреть лишь перегрузку функций. Этим мы сейчас займемся.

Перегрузка функций в С++

Один и тот же метод можно вызывать с различными типами и даже различным количеством параметров. Например, может существовать метод display(), отображающий на экране отдельный символ, используя для этого тип char C++, и он - же целую строку символов, которая в стандартном C++ интерпретируется как массив символов. Иначе говоря, метод display() может вызываться как для отдельного символа, так и для массива символов. Рассмотрим как это делается на примере новой программы overloading. Создайте проект, а в нем — файл overloading.срр"

Здесь в функции main() будет создаваться новый объект DisplayObject:

Void main()

{

DisplayClass DisplayObject;

}

В этом объекте будет находиться метод display(). Сначала мы вызовемего для отображения единственного символа 'h':

void main()                   

{

        DisplayClass DisplayObject;

DisplayObject.dlsplay('h');

}

Тот же метод можно вызвать и для строки (то есть массива символов), которая в нашем примере состоит всего лишь из однойбуквы " i " (в C++ двойные кавычки говорят о том, что речь идет о строке, а не об отдельном символе):

void main()

{  

 DisplayClase DisplayObject;

DisplayObject.display('h');

DisplayObject.display("i");

cout << "\n";

}

Один и тот же метод вызывается для аргументов двух типов — символа и строки. Но как это сделать? В C++ это совсем не сложно — нужно лишь определить метод дважды, по одному разу для каждого типа предполагаемых параметров. Повторное определение метода display() может выглядеть так:

#include <iostream.h>

class DisplayClass

{

public:

void display(char character);

void display(char* string);

};










Последнее изменение этой страницы: 2018-04-12; просмотров: 585.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...