public:
bird() : animal(), topfly(0.0) {}
bird(const bird& obj) : animal(obj), topfly(obj.topfly) {}
bird(const string& _title, double _mass, double _speed, double _topfly) :
animal(_title, _mass, _speed), topfly(_topfly) {}
~bird() { cout << "bird deleted" << endl; }
protected:
// виртуальная функция _print переопределяется
// теперь уже в классе bird
void _print() const
{
animal::_print();
cout << ", topfly: " << topfly;
}
};
// класс fish наследуется от класса animal
class fish : public animal
{
private:
double maxdeep; //km
public:
fish() : animal(), maxdeep(0.0) {}
fish(const fish& obj) : animal(obj), maxdeep(obj.maxdeep) {}
fish(const string& _title, double _mass, double _speed, double _maxdeep) :
animal(_title, _mass, _speed), maxdeep(_maxdeep) {}
~fish() { cout << "fish deleted" << endl; }
protected:
// виртуальная функция _print переопределяется
// в классе fish
void _print() const
{
animal::_print();
cout << ", maxdeep: " << maxdeep;
}
};
// объявление нового класса - хищник (predator)
// класс predator наследуется от animal
class predator : public animal
{
protected:
predator() {}
public:
~predator() {}
// виртуальная функция hunt
// будет определять посредством производных классов,
// удастся ли хищнику поохотиться на жертву (obj)
virtual bool hunt(const animal& obj) = 0;
// т.к. hunt в данном классе - виртуальная,
// класс predator является абстрактным
};
// класс орел (eagle) наследуется от bird и predator
// (множественное наследование), т.к. орел - и птица, и хищник
class eagle : public bird, public predator
{
public:
eagle() : bird() {}
eagle(const eagle& obj) : bird(obj) {}
eagle(double _mass, double _speed, double _topfly)
:bird("Орел", _mass, _speed, _topfly) {}
// определение тела функции hunt
// т.к. hunt определена, класс eagle - НЕабстрактный
bool hunt(const animal& obj)
{
// т.к. функция get_mass можетнаследоваться классом eagle
// из класса animal и через класс bird, и через класс predator
// укажем, что она наследуется через bird
return obj.get_mass() < bird::get_mass() &&
obj.get_speed() < bird::get_speed();
}
};
int main()
{
setlocale(0, "Rus");
bird raven("Ворона", 0.3, 10, 0.1);
eagle eagle1(1, 100, 1);
fish hammerhead("Рыба-молот", 150, 5, 0.5);
raven.print();
hammerhead.print();
cout << "Eagle vs raven: " << eagle1.hunt(raven) << endl;
cout << "Eagle vs hammerhead: " << eagle1.hunt(hammerhead) << endl;
cout << endl;
system("pause");
return 0;}
При выполнении данной работы необходимо определить базовый класс и производные от него классы. Предусмотреть использование виртуальных функций.
Требуется создать абстрактный базовый класс, определить общие методы print(), get(), set() и, при необходимости, специфические для каждого производного класса методы. Создать набор производных классов. Заполнить их значениями. Вызывая виртуальные функции для экземпляров классов убедиться, что при одной и той же сигнатуре вызова – каждый раз отрабатывает нужный в данном случае экземпляр виртуальной функции.
Базовый класс - «Транспорт», производные классы «Поезд», «Автобус», «Корабль».
Поля базового класса:
– название;
– количество мест.
Дополнительные поля класса «Автобус»:
– номер маршрута (тип string);
– скорость.
Дополнительные поля класса «Поезд»:
– номер поезда;
– количество вагонов.
Дополнительные поля класса «Корабль»:
– водоизмещение;
– число кают;
– скорость.
Для того, чтобы протестировать каждый класс в программе нужно сделать следующее:
– создать объект класса с использованием конструктора без параметров (все параметры потом установить с помощью методов set());
– создать объект с использованием конструктора с параметрами;
– создать объект с использованием конструктора копирования (потом поменять часть значений полей объекта с использованием методов set();
– вывести на экран созданные объекты с использованием метода print();
– вывести на экран созданные объекты в виде таблицы, используя методы get().