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 прямоугольника и три окружности.
Использовать абстрактные классы.