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

Однако метод move() класса vehicle выводит строку "Driving..." (то есть "Еду..."), а для вертолета это не подходит. Следовательно, мы должны переопределить метод move() в классе helicopter так, чтобы он выводил строку "Flying..." (то есть "Лечу..."):
#include <iostream.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() и move() класса helicopter можно свободно вызывать в функции main():
#include <iostream.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();
}

Программа для демонстрации наследования готова - запустите ее. Результат ее работы изображен на рис. 1.9. Как видно на рисунке, переопределенный метод move() успешно работает и выводит строку "Flying..." вместо "Driving...". В этой программе мы познакомились с техникой наследования и переопределения методов в C++. Ниже приведен полный текст программы из файла inheritance.cpp.

 
Рис. 1.9. Переопределение метода в C++

inheritance.cpp
#include <iostream.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();
}

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

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

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

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

В этом объекте будет находиться метод display(). Сначала мы вызовем его для отображения единственного символа "h":
void main()
{
DisplayClass DisplayObject;
DisplayObject.display("h");
.
.
.
}

Тот же метод можно вызвать и для строки (то есть массива символов), которая в нашем примере состоит всего лишь из одной буквы "i" (в C++ кавычки говорят о том, что речь идет о строке, а не об отдельном символе):
void main()
{
DisplayClass 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);
};
void DisplayClass::display(char character)
{
  cout << character;
}
void DisplayClass::display(char* string)
{
cout << string;
}

Но как C++ определяет, какую версию display() использовать при вызове метода? По типу передаваемого параметра. Например, если параметр относится к символьному типу, вызывается версия display() для символьного параметра. Если же передать ему строку, будет использована вторая версия.

Запустите программу; результат ее работы изображен на рис. 1.10. Как видно из рисунка, перегрузка метода display() прошла успешно. В этой книге мы будем пользоваться этой методикой достаточно часто.

 
Рис. 1.10. Перегрузка метода в C++

Ниже приведен полный текст программы из файла overloading.cpp.
overloading.cpp
#include <iostream.h>
class DisplayClass
{
public:
void display(char character);
void display(char* string);
};
void DisplayClass::display(char character)
{
cout << character;
}
void DisplayClass::display(char* string)
{
cout << string;
}
void main()
{
DisplayClass DisplayObject;
DisplayObject.display("h");
DisplayObject.display("i");
cout << "\nquot;;
}
В этом уроке мы узнали немало нового, познакомились со многими основными понятиями C++ - классами, объектами, наследованием, перегрузкой, переопределением и т. д. В следующем уроке мы увидим, как применить их на практике при создании настоящих программ для Windows. Если изложенный материал не вызвал у вас особых затруднений, переходите к уроку 2. В противном случае вам стоит почитать дополнительную литературу по программированию, потому что в следующем уроке мы займемся Visual C++ вплотную.
















































































































Что нового мы узнали?

В этом уроке мы:

· Познакомились с концепциями классов и объектов C++.

· Узнали, как пользоваться наследованием C++.

· Научились пользоваться конструкторами и деструкторами.

· Научились перегружать методы, чтобы они получали параметры различных типов.

· Научились изменять методы базового класса с помощью переопределения C++.

                       

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: