Polymorphism

أنشِئ Class :

اسمه: novel

المتغيرات : ntype, nprice

يحوي : دالة تقوم بعمل return لسعر الرواية وهو 30 بشكل عام ، ودالة تقوم بعمل return لنوع الرواية وهو general ودالة لطباعة المعلومات .

هذا الـ Class  هو Base Class  ، والتالية هي  Derived Classes  : “مفهوم الوراثة

الـ  Classes التالية لديها مثل متغيرات الـ Class الأب ، ولكن تعريفات(وليست أسماء) أخرى للدوال عن تلك الموجودة في الـ class الأب !

الـ Class الأول  :

اسمه: Agatha

يحوي : يختلف بأن سعر الرواية هو 15 ونوعها mystery .

الـ Class الثاني:

اسمه: McGraw

 يحوي : تختلف فقط في سعر الرواية هو 20 أما النوع لايختلف عن النوع العام general .

الـ Class الثالث:

اسمه: Signed

 يحوي : تختلف فقط في نوع الرواية هو signed أما السعر لايختلف عن السعر العام 30.

أكتب هذه الـ Classes بحيث في main عندما تُنشِئ pointer من نوع novel  وتجعله يشير لأنواع مختلفة من الـ objects يعرض معلومات صحيحة لكل نوع ، بمعنى عندما تجعله يشير للـ object من نوع Signed وتقوم بتعبئة معلوماته عن طريق الدوال ثم تطبع المعلومات نجد أن النوع ليس general وإنما signed.  “مفهوم الـ polymorphism”

الحل:

#include <iostream>
#include <string>
using namespace std;

class novel
{
public:
 double nprice;
 string ntype;

 virtual double price(){ return 30; }
 virtual string type(){ return "general"; }

 void display()
 {
 cout << "Novel price= " << nprice << endl;
 cout << "Novel type= " << ntype << endl;
 }
};
//-----------------------------------------------------//
class Agatha :public novel
{
public:
 double price(){ return 15; }
 string type(){ return "mystery"; }
};
//----------------------------------------------------//
class McGraw :public novel
{
public:
 double price(){ return 20; }
};
//----------------------------------------------------//
class Signed :public novel
{
public: string type(){ return "signed"; }
};
//----------------------------------------------------//
void main()
{
 Agatha a;
 McGraw m;
 Signed s;
 novel *n;

 n = &a;
 //fill info
 n->nprice = n->price();
 n->ntype = n->type();
 //print
 n->display();

 n = &m;
 n->nprice = n->price();
 n->ntype = n->type();
 n->display();

 n = &s;
 n->nprice = n->price();
 n->ntype = n->type();
 n->display();

 system("pause");
}

السطر 11 و 12 : كلمة virtual هي التي تسمح لي بإعطاء تعريفات اخرى للدوال في الـ classes الأخرى 

Advertisements

Cascading

أنشِئ Class :

اسمه: MyAge

المتغيرات : Year , Month , Day

يحوي :  Set functions و Print Function  و  default constructor.

* يجب أن تُكتب الـ functions حتى نستطيع أن نقوم بعمل Cascading Call في Main functions .

-قم بفصل الـ Class interface  في header file و Class implementation في cpp file

الحل:

طريقة كتابة الـ function حتى نستطيع القيام بعمل Cascading Call هي أن

  1. يكون الـ return type لها هو object من نفس نوع الـ Class بهذه الطريقة  ( & ClassName  ) .

  2. أن تكون الـ return value هي pointer للـ object الذي قام باستدعاء هذه الـ function وهو *this .

//.h
#include <iostream>
using namespace std; 

class MyAge
{
public:
 MyAge();
 MyAge &My_yers(int);
 MyAge &My_month(int);
 MyAge &My_day(int);
 void print();


private:
 int year;
 int month;
 int day;

};
------------------------------------------------------
//.cpp
#include <iostream>
#include "MyAge.h"
using namespace std;

MyAge::MyAge(){ year = 0; month = 0; day = 0; } //default constructor

MyAge & MyAge::My_yers(int y)
{
 year = y; //initialize years
 return *this; //return value
}

MyAge & MyAge::My_month(int m)
{
 month = m; //initialize month
 return *this; //return value
}

MyAge & MyAge::My_day(int d)
{
 day = d; //initialize day
 return *this; //return value
}

void MyAge::print()
{
 cout << year << "/" << month << "/" << day << endl; /*ptint out years and months */
}
-----------------------------------------------
//main
#include <iostream>
#include "MyAge.h"
using namespace std;

void main()
{
 MyAge age;

 age.My_yers(2000).My_month(1).My_day(20).print(); //Cascading Call

 system("pause");

}