
техпрог / Comp-Sci-11
.pdf
Материалы к лекции 11
Объектно-ориентированное программирование
Абстрактные классы
Чисто виртуальные функции
Классы, объекты которых не создаются, называются абстрактными. Такой класс должен включать метод, не содержащий реализации. Этот метод должен переопределяться в производных классах.
Нереализованные методы класса создаются с помощью механизма чисто виртуальных функций. Виртуальная функция объявляется как чисто виртуальная, если в прототипе этой функции указывается “=0” в самом конце.
virtual void Draw()=0;
Класс с одной или несколькими чисто виртуальными функциями является (называется) абстрактным.
Пример. Развитие примера с прошлой лекции. Класс Shape – абстрактный, функция Draw() – чисто виртуальная.
// CAbstract1.cpp : Иерархия классов с базовым абстрактным классом.
//
#include "stdafx.h"

#include <iostream> using namespace std;
class Shape
{ // абстрактный класс protected:
string petName; public:
//Конструкторы: Shape(){petName = "NoName";} Shape(string s){petName = s;}
//Операции:
virtual void Draw()=0; // чисто виртуальная функция virtual ~Shape(){} // виртуальный деструктор
};
class Circle : public Shape
{
public:
Circle():Shape("circle"){}; Circle(string name):Shape(name){}; void Draw() // реализация функции
{
cout<<"\n -Circle-Draw- \n";
}
};
class Oval: public Circle
{
public:
Oval():Circle("Oval"){}; void Draw()
{
cout<<"\n - Oval-Draw- \n";
}
};
class Hexagon: public Shape
{
public:
Hexagon(){petName="Hexagon!";} Hexagon(string s):Shape(s){}; void Draw()
{
cout<<"\n - Hexagon-Draw- \n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//Shape figure; // Ошибка - нельзя создать объект абстрактного класса!
//Shape ob[4]={Circle("Krug"),Circle(),Oval(),Hexagon()};// Уже нельзя!
//А указатели на базовый абстрактный класс создавать можно:
Shape *pob[4]={new Circle("Krug"),new Circle(),new Oval(),new Hexagon()}; for(int j = 0; j < 4; j++)
{
pob[j]->Draw();
}
return 0;
}

Диаграмма классов в Visual Studio

Пример. Развитие второго примера с прошлой лекции
// CAbstarct2.cpp : Пример наследования с абстрактным классом.
//
#include "stdafx.h" #include <string> #include <iostream> using namespace std;
class Transport // абстрактный класс
{
protected:
string name; // Constructors:
public:
Transport() { name = "NoName"; } Transport(string s) { name = s; }
virtual ~Transport(){} // виртуальный деструктор
virtual void PlaySignal()=0;// чисто виртуальная функция
virtual void Info()
{
cout<<"\nTransport: "<<name <<"\n";
PlaySignal();
}
};
class Velo : public Transport
{
int wheels; // число колѐс public:
Velo(string name,int w): Transport(name){wheels=w;} void PlaySignal()
{
cout<<"\nDin - Din";
}
};
class Moto : public Transport
{
int cylinders; // число цилиндров

public:
Moto(string name, int cy) : Transport(name) { cylinders = cy; } void PlaySignal()
{
cout<<"\nBap - Bap";
}
};
class Auto : public Transport
{
int doors; // число дверей public:
Auto(string name, int d) : Transport(name) { doors = d; } void PlaySignal()
{
cout<<"\nBee Bip";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
// Transport p1= Moto("Ural",2); /* Ошибка - запрещено создавать объекты абстрактного класса */
Transport* pp[4]; /* Указатель, имеющие тип абстрактного класса, создавать можно */
pp[0]= new Velo("Sputnik",2); pp[1]= new Moto("Ural",2); pp[2]= new Auto("Lada",4); pp[3]= new Auto("Niva",2);
for(int i = 0; i < 4; i++)
{
pp[i]->Info();
}
return 0;
}
Проектирование иерархии классов
Иерархия классов – средство последовательного построения классов. Иерархия абстрактных классов предоставляет способ выражения концепций, не загроможденных вопросами реализаций.