Class Circle:public Form

{public:virtual void Draw(){//тіло}};

Class Line:public Form

{public:virtual void Draw(){//тіло}};

Виділяємо пам'ять:

picture[0]=new Line;

picture[1]=new Line;

picture[2]=new Circle;

Програма готова.

Чисті віртуальні функції. Абстрактні класи

Чиста вiртуальна функцiя-член – це прототип функції, для якої не потріб­не визначення в протоколі класу. Синтаксично чиста віртуальна фун­кція задається так:

virtual<тип><iм'я>(сигнатура)=0;

Клас, який мiстить чисті вiртуальнi функцiї, називається абстрактним. Наприклад:

class AbstractClass {

public:

virtual void f1(void);

virtual void f2(void)=0;//...};

Специфіка абстрактного класу полягає в тому, що він не може мати екземплярів. При оголошенні AbstractClass my; відбудеться помилка на етапі компіляції. Для використання абстрактного класу необхідно визначити похідний від нього клас, у якому чиста віртуальна функція оголошується як звичайна віртуальна. Причому в цьому випадку вона повинна мати тіло. Розглянемо клас

class MyClass:public AbstractClass{

public:

virtual void f2(void);//...}

void MyClass::f2(void){\\тіло}

Звернемо увагу на те, що в класі MyClass f2() є вже звичайною вір­туальною функцією, отже, має бути її визначення (у даному випадку – за межами формального опису класу). Тоді можна буде описати екземпляр класу MyClass.

Чиста віртуальна функція може вільно використовуватись у протоколі абстрактного класу.

Похідний клас, який не визначає всі чисті віртуальні функції базового, також абстрактний. Напишемо програму, яка маніпулює з множинами без урахування їх типів:

#include <stdio.h>

#include <iostream.h>

#include <stdlib.h>

#include <string.h>

class Element;

typedef Element*PElem;

typedef PElem*PPElem;

class Set;

typedef Set*PSet;

class Set{

private:

Int max; //-кiлькiсть елементiв

int index;

PPElem set;

protected:

virtual int CompareElem(PElem P1,PElem P2)=0;

public:

Set(int n)

{max=n;index=0;

set=new PElem[n];}

virtual~Set()

{delete[]set;}

void AddElem(PElem p);

int HasElem(PElem p);

};

Void Set::AddElem(PElem p)

{if(set==NULL)

{cout<<"\nError";

exit(1);}

if(index>=max){

cout<<"\nError,Set limit excluded";

exit(1);}

set[index]=p;

++index;}

Int Set::HasElem(PElem p)

{if(set==NULL)return 0;

for(int i=0;i<index;i++)

if(CompareElem(p,set[i])==0)

return 1;return 0;}

Запишемо визначений клас Set у файл Set.h:

#include"set.h"

class Element{

private:

char*sp;

public:

Element(const char*s)

{sp=strdup(s);}

virtual~Element(){delete sp;}

virtual const char*GetString(void)

{return sp;}

};

class Myset:public Set{

protected:


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



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