Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

техпрог / Comp-Sci-11

.pdf
Скачиваний:
44
Добавлен:
10.02.2015
Размер:
1.08 Mб
Скачать

Материалы к лекции 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;

}

Проектирование иерархии классов

Иерархия классов – средство последовательного построения классов. Иерархия абстрактных классов предоставляет способ выражения концепций, не загроможденных вопросами реализаций.

Соседние файлы в папке техпрог