Однако метод 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++.