الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح virtual function

مغلق
بدأه UAB في 27 يوليو 2005 · 5 رد · 7,939 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

شباب .. أرجوكم أريد درس بالعربي أو أي أحد يشرحلي ماهو virtual function

#2

بسم الله الرحمن الرحيم

السلام عليكم

بدايتا كلمة virtual تعنى شيى وهمى يعنى شى ظاهر بس مش موجود فعلي

لماذا يتم أستخدام الvirtual function

أفترض ان عندك عدد من الobjects المختلفة المأخوذو من مجموعة classes مختلفة يعنى objects of different classes

ولكن انت تريد وضع كل ذلك داخل array وكل object يقوم

calling the same function that have same name

يعنى لو عندك

two classes which derived from base class and implement the same function

يعنى كل class بة دالة show

لاحظ ذلك المثال وانت تفهم

حيث عبارة عن class A وتم عمل inhert منة الى two classes وهم B,C

حيث كل class يحتوى على دالة بنفس الاسم ويتم عمل access لتلك الدوال عن طريق

pointer which point to the base class

#include <iostream>
#include <conio>
class A
{
 public:
    void show()
         {
           cout<<"class A\n";
         }
};
class B:public A
{
 public:
    void show()
         {
           cout<<"class B\n";
         }
};
class C:public A
{
 public:
    void show()
         {
           cout<<"class B\n";
         }
};
void main()
{
 B b;
 C c;
 A *ptr;
 ptr=&b;
 ptr->show();
 ptr=&c;
 ptr->show();
 getch();
}

حيث كل من class b,c عبارة عنderived class from a

داخل الmain عملت create to two objects

وعملت pointer to base class

حيث فى ذلك السطر تم جعل محتوى الpointer الaddress بتاع الobject b اللى انا واخدة من الclass B

ptr=&b;

حيث تم وضع عنوان الderived class object داخل الpointer

وفى ذلك السطر

ptr->show();

أى من الدوال سيتم نتفيذها هل

A::show();      or    B::show();

حيث فى ذلك السطر يعمل الcompiler تجاهل الى محتوى الpointer ويعتمد على نوع الpointer وبما ان

الtype of this pointer is A

لذلك سيكون الoutput

Class A

Class A

يعنى لم يتم تنفيذ الدالتين الموجودين فى الdrived classes

طب وحل تلك المشكلة عن طريق استخدام الvirtual function

حيث يتم وضع كلمة virtual كما يلى

Virtual DataType FunctionName ()
{
          //code implementation
}

لاحظ الكود السابق بعد التعديل

#include <iostream>
#include <conio>
class A
{
 public:
     virtual	void show()
         {
           cout<<"class A\n";
         }
};
class B:public A
{
 public:
    void show()
         {
           cout<<"class B\n";
         }
};
class C:public A
{
 public:
    void show()
         {
           cout<<"class C\n";
         }
};
void main()
{
 B b;
 C c;
 A *ptr;
 ptr=&b;
 ptr->show();
 ptr=&c;
 ptr->show();
 getch();
}

وبالتالى سيتم تنفيذ الدوال على حسب محتوى الpointer وليس على النوع ذلك الpointer كما فى المثال الاول

ودة يسمى بالlate binding or dynamic binding

يعنى ينتظر الى مرحلة الrunning حتى يعرف اى دالة سيتم تنفيذها عكس الearly binding or static binding

حيث يتم معرفة الدالة التى سيتم تنفيذها فى مرحلة الcompilation

حيث يتم كتابة كلمة virtual الى الدالة الاساسية الموجودة داخل الbase class or parent class اللى يتم عمل inhert منة

ولا يتم كتابتها فى باقى الderived classes حيث تعتبر الدالة المكتوبة فى الderived class تعتبر override للدالة الvirtual

أما عن الbase class كما قلنا هو الparent class اللى يتم عمل inherit منة لو حبيت اخلية abstract class يعنى لا يتم عمل object منة ولكن يتم أخذ منة pointer to base class (حيث بهذا الpointer ممكن يشاور على الderived class ) وبالتالى أعمل على الاقل دالة واحدة تكون pure virtual function

وتكتب

Virtual DataType NameFunciton ()=0;

حيث ذلك الexpression يعنى ان بقول للcompiler ياعم الcompiler الدالة دى pure virtual يعنى ماينفعش تعمل object من ال class اللى بيحتويها

حيث يعتبر الabstract class فى ذلك الموقف interface to derived classes

بلحظ ذلك الكود

#include <iostream>
#include <conio>
class Abstract
{
 public:
     virtual void show()=0;
};

class B:public Abstract
{
 public:
      void show()
         {
          cout<<"class B\n";
         }
};

class C:public Abstract
{
 public:
      void show()
         {
          cout<<"class C\n";
         }
};
void main()
{
 B b;
 C c;
    // Abstract a;        //Error cant create instance of abstract class   abstract
 Abstract *array[2];
 array[0]=&b;
 array[1]=&c;
 for(int i=0;i<2;i++)
  array->show();
 getch();
}

حيث ماينفعش اعمل object من الclass abstract

ولكن ممكن أعمل pointer وذلك الpointer ممكن يشاور على باقى الclasses derived

virtual void show()=0;

فى ذلك السطر بقول للcompiler ياعم الcompiler تلك الmethod عبارة عن pure virtual function

وبالتالى مايبفعش الprogrammer يأخد منها object

وحينما تعمل الدالة pure virtual function يبقى اى class يتم عمل لة inherit من الabstract class لازم لازم يمعل override to this function

كما حدث مع الclass b,c

لاحظ ذلك البرنامج

#include <iostream>
#include <conio>

class b;
class ab
{
  public:
      virtual void GetData()=0;
          virtual void PrintData()=0;
};

class a:public ab
{
 private:
     int A;
 public:
          a():A(0)
          {}
          a(int v):A(v)
          {}
          void GetData()
          {
            cout<<"enter the number:\t";    cin>>A;   cout<<"\n";
          }
         int getData()
         {
           return A;
         }
         void PrintData()
         {
           cout<<"ur variable is:\t"<<A<<"\n";
         }
         friend int sum(a,b);
};
class b:public ab
{
 private:
     int B;
 public:
          b():B(0)
          {}

     b(int v):B(v)
           {}
          void GetData()
          {
            cout<<"enter the number:\t";    cin>>B;   cout<<"\n";
          }
         void PrintData()
         {
           cout<<"ur variable is:\t"<<B<<"\n";
         }
         friend int sum(a,b);

};
int sum(a AA,b BB)
 {
   return (AA.A+BB.B);
 }
void main()
{
 ab *o;
 a AAA;
 b B;

 o=&AAA;
 o->GetData();
 o->PrintData();

 int x=AAA.getData();
 //a X(x);
 o=&B;
 o->GetData();
 o->PrintData();
 cout<<"the result is:\t"<<sum(AAA,B)<<" \n";
getch();
}

فى بداية الامر عملت definition للclass b كما موضح

class b;

وذلك لانى مستخدم الfriend function

ثم فى class أسمة ab وهو عبارة عن abstract class عرفت فية two pure virtual function وهمGetDataو PintData

وبالتالى اى class يكون inherit from this class must override this two function

كما فى الclass a

عرفت variable وهو A من النوع int

وعملت constructors ثم عملت override الى وهمGetDataو PintData

ثم عرفت دالة friend تأخذ two argument وهم من النوع a,b

وكما عملت ف الclass a عملت ف الclass b

ثم عرفت الfriend function

وفى الmain

خدت pointer from abstract class as I cant made object from it

وعرفت two object from a,b

وجمعتهم عن طريق الfriend function

ويارب أكون حاولت اوضحلك الvirtual function وتكون أستفدت

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#3

أة نسيت ملحوظة أخيرة

ند تعريف الدالة ك virtual تكتب تلك الكلمة داخل ال class ولا يمكن تعريف دالة داخل البرنامج الرئيسيى كدالةvirtual

ويتم كتابة كلمةvirtual داخل التصنيف فقط حتى ولو قمت بتعريف الدالة خارج الclass أنظر الى ذلك

class A
{
 public:
    virtual void show();
};
void A::show()
{
 //code immplementation
}

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#4

مشكووووووووووووووووووووووووووووووووووووووووووووووووور

#5

لو اني ما احب الردود اللي من قبيل مشكور وبس ... لكن الاخ eng_3llam يجبرك على شكره .. خاصة انه يحارب في اكثر من جبهة .. لنصرة اهل السي :)

جزاك الله خير .

للمعلومية الدوال التخيلية .. وتعدد الواجهات .. مافهمتها الا من اسبوع تقريبا .. من ::::اهل المنتدى هذا : ::::

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

شكرا لكم جميعا

ويارب ياأخUAB اكون قد أوضحت لك بداية الطريق فى الvirtual function

شكر خاص للاستاذ الشمرى(أخجلتنى والله من كلامك الجميل) وشكرا لك على اهتمامك بمشاركاتى

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

هذا الموضوع مغلق.

مواضيع مشابهة