شباب .. أرجوكم أريد درس بالعربي أو أي أحد يشرحلي ماهو virtual function
شرح virtual function
بسم الله الرحمن الرحيم
السلام عليكم
بدايتا كلمة 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 وتكون أستفدت
أة نسيت ملحوظة أخيرة
ند تعريف الدالة ك virtual تكتب تلك الكلمة داخل ال class ولا يمكن تعريف دالة داخل البرنامج الرئيسيى كدالةvirtual
ويتم كتابة كلمةvirtual داخل التصنيف فقط حتى ولو قمت بتعريف الدالة خارج الclass أنظر الى ذلك
class A
{
public:
virtual void show();
};
void A::show()
{
//code immplementation
}مشكووووووووووووووووووووووووووووووووووووووووووووووووور
لو اني ما احب الردود اللي من قبيل مشكور وبس ... لكن الاخ eng_3llam يجبرك على شكره .. خاصة انه يحارب في اكثر من جبهة .. لنصرة اهل السي :)
جزاك الله خير .
للمعلومية الدوال التخيلية .. وتعدد الواجهات .. مافهمتها الا من اسبوع تقريبا .. من ::::اهل المنتدى هذا : ::::
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
هذا الموضوع مغلق.