Class A

Class Base_Class

На следующем примере можно проследить разницу между виртуальными и невиртуальными функциями

ПОЛИМОРФИЗМ И ВИРТУАЛЬНЫЕ ФУНКЦИИ

Базовый класс, описывающий точку имеет:

- два поля x, y.

- функцию ввода значений полей

- функцию печати полей

class Point

{

public:

int x, y;

public:

void Setxy (int xx,int yy)

{

x=xx; y=yy;

}

void Displxy ()

{

cout << x <<" "<<y;

}

};

Класс наследник описывает точку в пространстве имеет:

- три поля x, y, z.

- функцию ввода значений полей x, y

- функцию ввода значений поля z

- функцию печати полей x,y, z;

class Opoint: public Point

{

public:

int x,y, z;

public:

void Setxy (int xx,int yy)

{

x=xx; y=yy;

}

void Setz (int zz)

{

z=zz;

}

void Displxy ()

{

cout <<x <<" "<<y<<" "<<z;

}

};

//==============================

void main ()

{

Point a;

a.Setxy(1,2);

a.Displxy ();

Opoint b;

b.Setxy(3,4);

b.Setz(5);

b.Displxy ();

getch ();

}

Вот как бы это выглядело в производном классе

class OtherPoint: public Point

{

public:

int x, y;

void Setxy (int xx,int yy)

{

x=xx; y=yy;

}

void Setxy_baz(int xx,int yy)

{

Point::x=xx; Point::y=yy;

}

};


virtual

class Base

{

public:

virtual void Display()

{

puts("\n Базовый класс");

}

};

class Nasl:public Base

{

public:

virtual void Display()

{

puts("\n Класс наследник");

}

};

void Show (Base *ob)

{

ob->Display();

}

void main()

{

Base *a=new Base;

Nasl *b=new Nasl;

a->Display();

b->Display();

////////////////

Show (a);

Show (b);

}

Результат

Базовый класс

Класс наследник

Базовый класс

Класс наследник
vtbl таблица виртуальных методов

vptr

{

public:

virtual void VirtFunc()

{

cout <<"Base_Class::VirtFunc() \n ";

}

void NoVirtFunc()

{

cout <<" Base_Class::NoVirt() \n ";

}

};

class Proizv_Class:public Base_Class

{

public:

virtual void VirtFunc()

{

cout <<"Proizv_Class::VirtFunc() \n ";

}

void NoVirtFunc()

{

cout <<"Proizv_Class::NoVirt() \n ";}

};

void main()

{

Base_Class *ptb = new Base_Class;

ptb->VirtFunc();

ptb->NoVirtFunc();

Proizv_Class *ptd = new Proizv_Class;

ptd->VirtFunc();

ptd->NoVirtFunc();

Base_Class * ptb1=new Proizv_Class;

ptb1->VirtFunc();

ptb1->NoVirtFunc();

}


Base_Class::VirtFunc()

Base_Class::NoVirt()

Proizv_Class::VirtFunc()

Proizv_Class::NoVirt()

Proizv_Class::VirtFunc()

Base_Class::NoVirt()

АБСТРАКТНЫЕ КЛАССЫ И "ЧИСТЫЕ" ВИРТУАЛЬНЫЕ ФУНКЦИИ

class base

{

public:

virtual print() =0;

virtual get() =0;

}

{

public:

virtual void PrintOn()=0;

};

class B:public A

{

public:

virtual void PrintOn(){puts("\n Klass B");}

};

class C:public B

{

public:

virtual void PrintOn(){puts("\n Klass C");}

};

void Show (A *ob)

{

ob->PrintOn();

}

void main()

{

B *b=new B;

C *c=new C;

Show (b);

Show (c);

}

Klass B

Klass C


Пример. Построить последовательно 6 фигур, имеющих различные места расположения, размеры и цвет заливки 3 прямоугольника и три окружности.

Использовать абстрактные классы.


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



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