|
|||
Пример программирования. Пример 1.3.Пример программирования Пример 1.2. Написать программу с наследованием класса стек от класса массив. #include <iostream> #include <stdlib.h> using namespace std;
class massiv { int *num; int kol; public: massiv(int n); void print(); virtual int kolich(){return kol;} void put(int k,int n){num[k]=n;} ~massiv(){delete num;} }; massiv::massiv(int n) { num=new int[n]; kol=n; for(int i=0;i<kol;i++) num[i]=random(100)-50; } void massiv::print() { for(int i=0;i<kolich();i++) cout<<num[i]<<" "; cout<<endl; } class stec:public massiv { int top; public: stec(int); virtual int kolich() {return top;} void pop(int k); }; stec::stec(int n):massiv(n) { top=0; } void stec::pop(int k) { put(top++,k); } void main() { randomize(); massiv a(10); a.print(); stec b(10); b.pop(random(100)-50); b.pop(random(100)-50); b.pop(random(100)-50); b.print(); } Главное отличие виртуальной функции от просто перегруженной в том, какая функция будет вызываться при рассмотрении производного класса как базового. Пример 1.3. #include <iostream> using namespace std; class Base { public: Base(){}; Print(){ cout<<”I’m a Base print”<<endl;} virtual View(){ cout<<”I’m a Base view”<<endl;} }; class Derived: public Base { public: Derived(){}; Print(){ cout<<”I’m a Derived print”<<endl;} View(){ cout<<”I’m a Derived view”<<endl;} }; void main(void) { Base *A=new Base; Derived *B=new Derived; Base *C; A->Print(); A->View(); B->Print(); B->View(); C=(Base *)B; C->Print(); C->View(); } Результат: “I’m a Base print” “I’m a Base view” “I’m a Derived print” “I’m a Derived view” “I’m a Base print” “I’m a Derived view” Таким образом, мы видим, что виртуальные функции позволяют нам всегда работать с теми функциями, которые специфичны именно для используемого класса, даже когда мы рассматриваем его как базовый.
|
|||
|