د .نضال خضير العبادي /جامعة الكوفة [email protected] . عردد مررات تكررار حررف معرين .يحتروي الصرنف علرى دوال البنراء والهدم ,دوال اولصول ,دوال الطباعة. .4اكتب برنرامج لتنفيرذ صرنف دائررة .Circleكرل كيران فري هرذا الصرنف يمثل دائررة ,خرزن نصرف قطرهرا ,احرداثيات المركرز كارقرام حقيقيرة. يتضمن الصنف دالة البناء الافتراضية ,دوال الوصرول ,دالرة مسراحة الدائرة ,ودالة محيط الدائرة. .5اكترب برنرامج لتنفيرذ صرنف مصرفوفة ثنائيرة ,Matrixتتضرمن دالرة البنرراء الافتراضررية ,دالررة الاستنسرراخ ,دالررة ايجرراد الرررقم الاكبررر فرري المصفوفة ,دالة حساب المجموع ,دالة الطباعة. .6اكترب برنرامج لصرنف شرخص .Personكرل كيران فري الصرنف يمثرل انسان .البيانات الاعضاء تشمل اسم الشرخص ,تراري المريلاد ,تراري الوفراة .يتضرمن الصرنف دوال البنراء والهردم ,دوال الوصرول ,ودالرة الطباعة. .7اكتب برنامج لتنفيذ صنف مكدس Stackللاعداد الصحيحة .تتضمن دوال البناء والهدم ,وعمليات المكدس الاعتيادية ( السحب والدفع هل هرري فارغررة او مملرروءة .) push, pop, isempty, isfullاسررتخدم المصفوفات للتنفيذ. .8اكتب برنامج لتنفيذ صنف متجة ,Vectorمع دالة البناء الافتراضرية, دالة استنساخ البناء ,دالة الهدم ,وتطابق ) (overloadعامرل المسراواة, عامل الطرا ,عامل الجمع. 515
C++من البداية إلى البرمجة الكيانية الفصل العاشر الوراثة Inheritance 21.2المقدمة مرن صرفات البرمجرة الكيانيرة الأسرتفادة مرن الخصرائص المعروفرة فري بررامج أخرى سابقة ،وهذ الوسيلة تمكن المبررمج مرن الحصرول علرى صرفات جديردة وذلرك بالأستفادة من التعاريف والبرامج المكتوبة فري صرنوف أخررى سرابقة بالاضرافة الرى الخصرائص الجديردة التري يمكرن اضرافتها ،وهري وسريلة تروفر الجهرد والوقرت .وقرد تساعد وسيلة التوارث على الحصول على معلومات من أكثر من صنف واحد وهرذ تسمى بالتوارث المتعدد أي الحصول على مساعدات من جهات مختلفة . الوراثة هي جزء جوهري من البرمجة الكيانية .هي دفعة كبيرة تسمح باعرادة استخدام الشفرة ،فعندما تكتب وتنقح الصنف الاساس ،فانك تحتراج لعردم المسراس بره ثانيرة ،ولكرن اسرتخدام الوراثرة يمكنرك مرن ذلرك ويسراعد علرى اسرتخدامة او تحرويرة لحالات مختلفة ،ان اعادة استخدام شفرة موجودة يقلل الوقت والكلفة ويزيد اعتمادية البرنامج. 21.1ماهي الوراثة اعرادة الاسرتخدام هري احردى الصرفات المهمرة للبرمجرة الكيانيرة .مرن المناسرب دائما اعادة اسرتخدام بعرض الاشرياء الموجرودة بردلا مرن اعرادة خلرق ذات الشريء كرل مررة ،والعمليرة لاتقتصرر علرى تروفير الوقرت والجهرد والمرال ولكرن ايضرا تقلرل مرن الأحباط وتزيد الاعتمادية .حاليا ان اعادة استخدام الصنف الذي ترم اسرتخدامة مسربقا والذي دقق واستخدم عدة مرات ممكن ان يوفر الجهد لتطوير واختبار نفسة ثانية. لحسرن الحرظ فران C++تردعم بشركل قروي فكررة اعرادة الاسرتخدام ،حير ان اصرناف C++ممكرن ان يعراد اسرتخدامها بعردة طررق ،فعنردما يكترب الصرنف مررة 516
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ويختبرر فمرن الممكرن ان يكيرف بواسرطة مبررمج اخرر لجعلرة يتناسرب مرع متطلباترة، وهذا يعمل اساسا عند خلق صرنف جديرد يكيرف لاعرادة اسرتخدام مواصرفات الصرنف الموجود. ان أليرة اشرتقاق صرنف جديرد مرن صرنف قرديم يردعى الوراثرة ،فري هرذ الحالرة فانك تحتاج الى الاشارة الى الصنف القديم الذي اشتق منره الصرنف الجديرد علرى انره الصنف الاساس ( )base classاما الصنف الجديد فيسمى الصنف المشتق ( derived )classمع ملاحمرة ان الصرنف الجديرد المشرتق يررث بعرض او كرل ميرزات الصرنف الاساس ،والصنف المشتق ممكن ان يرث من اكثر من صنف واحد او من اكثر مرن مستوى واحرد .ان حالرة كرون الصرنف المشرتق لره صرنف اسراس واحرد تسرمى وراثرة مفرردة ( )single inheritanceامرا اذا كران للصرنف المشرتق اكثرر مرن صرنف اسراس واحد فتسرمى وراثرة متعرددة ( ،)multiple inheritanceمرن جانرب اخرر فران الميرزات لصرنف واحرد ربمرا ترورث الرى اكثرر مرن صرنف واحرد وهرذ العمليرة تردعى الوراثرة الهرميرة ( )hierarchical inheritanceامرا اليرة اشرتقاق صرنف مرن اخرر (مشرتق مرن صرنف اخرر) تردعى الوراثرة متعرددة المسرتويات ( )multilevel inheritanceالشركل ( )11.1يبين اشكال الوراثة المختلفة التي من الممكرن اسرتخدامة لكتابرة برنرامج قابرل للتوسيع ..لاحظ اتجا الاسهم يمثل اتجاة الوراثة: 517
من البداية إلى البرمجة الكيانيةC++ و امة مفرده وراثة متعددة وراثة متعددة المستويات single multiple multilevel inheritance inheritance inheritance A A AB B BC C A BB C و امة هجينه Hybrid inheritance 518
د .نضال خضير العبادي /جامعة الكوفة [email protected] . A BCD و امة هرمية hierarchical inheritance شكل :21.2انواع الوراثة فالوراثة هي احدى احجار الزاويرة للبرمجرة الكيانيرة وذلرك لانهرا تسرمح لخلرق التصنيف الهرمي .فمع الوراثرة ،سريكون مرن الممكرن خلرق صرنف عرام والرذي يعلرن ويعرف المزايا العامة لمجموعة من العناصر ذات العلاقة ،هذا الصنف مرن الممكرن ان يكون موروثا مرن اصرناف اخررى ،اصرناف اكثرر تحديردا ،كرل منهرا يضريف فقرط تلك الاشياء التي تعد وحيدة للصنف الوارث. الوراثرة مرن الممكرن ان تكرون الصرفة الاكثرر قروة فري البرمجرة الكيانيرة بعرد الصرنف ،والوراثرة هري عمليرة خلرق اصرناف جديردة ،تردعى هرذ الاصرناف الجديردة (الاصررناف المشررتقة) ،امررا الصررنف الموجررود الررذي يشررتق منرره فيرردعى (الصررنف الاسراس) ،والصررنف المشررتق يرررث كررل الامكانيررات للصررنف الاسرراس وبامكانررة ان يضريف فلاترر واعمرال اخررى خاصرة بره ،علرى ان الصرنف الاسراس لايتغيرر بهرذ العملية. 519
C++من البداية إلى البرمجة الكيانية ولتوضيح ذلك ،نفر لدينا صنف باسم اللبائن ،هذا الصنف له صفات عامرة تتصرف بهرا اللبرائن حير ان جميرع اللبرائن تتحرر وتترنفب الهرواء ..ولنفرر لردينا صرنف اخرر باسرم (الكلرب) يرجرى ملاحمرة ان الكلرب ايضرا لره صرفات اللبرائن وهرو يتنفب الهواء ويتحر ،وعليه يمكن ان نعتبرة من صنف اللبائن ،ولكن لديره صرفات اخرى خاصة به تميز عن باقي اللبائن مثل صفات النباا ،تحريك الذيل ..بناء علرى ذلك يمكن ان نعتبر اللبائن هي الصرنف الاسراس الرذي يمثرل الصرفات العامرة للبرائن، والكلب هو صنف مشتق مرن صرنف اللبرائن وبمرا انره مشرتق مرن صرنف اللبرائن فانره سرريرث كررل الصررفات او الميررزات الترري يحتويهررا الصررنف الاسرراس (تررنفب الهررواء، الحركة) ،ولكنه سيضيف الرى الصرنف الاسراس صرفات او ميرزات خاصرة بره مثرل.. النباا ،تحريك الذيل وهكذا ،ومن الممكن ان يشتق من صنف الكلب اصناف اخررى مثلا صنف خاص لكلاب الصيد (لها صفات اضافية خاصة بها) وبذلك فان الصنف الجديرد سريرث ميرزات الصرنف الاسراس والرذي هرو صرنف الكلرب ويضريف ميرزات خاصة به وهكذا. The Syntax of 21.3الصووويغة القواعديوووة لاشوووتقا وووونف Derivation Class عنرد الاعرلان عرن صرنف ،فانره بأمكانرك ان تحردد اي صرنف مشرتق مرن اي صنف ،وذلك بكتابة النقطتين المتعامدتين بعد اسم الصنف المشتق ،ثم نوع الاشتقاق (عرام ،خراص ،او محمري) ،واسرم الصرنف الرذي يشرتق منره (الصرنف الاسراس) .ان الصنف المشتق منه (الصنف الاساس) يجب ان يكون معلن عنه مسبقا ،واذا لم يكن معلن عنه فان المترجم سيصدر رسالة خطأ. وعنردما يررث صرنف مرن صرنف اخرر ،فران اعضراء الصرنف الاسراس تصربح اعضاء في الصنف المشتق .الصيغة العامة لوراثة الصنف هي: 511
د .نضال خضير العبادي /جامعة الكوفة [email protected] . { class derived_class_name: access base_class_name ... ... ... ;} حالررة الوصررول لاعضرراء الصررنف الاسرراس داخررل الصررنف المشررتق تحرردد بمحرددات الوصرول .محرددات وصرول الصرنف الاسراس يجرب ان تكرون امرا عامرة، محميرة ،او خاصرة ( .)public, protected, or privatاذا لرم يكرن محردد الوصرول موجررود عنررد الأعررلان عررن الصررنف المشررتق فرران محرردد الوصررول سرريكون خرراص بالافترا . ان C++تميررررررررز بررررررررين نرررررررروعين مررررررررن الوراثررررررررة (العررررررررام والخرررررررراص) ) .)public and privateبرالافترا فران الاصرناف تشرتق واحردة مرن الاخررى علرى انها خاصة ،ولذلك يجب ان تخبرر المتررجم خارجيرا بنروع الوراثرة العامرة اذا اردت ان تكون الوراثة عامة وليست خاصة. اما اذا الصنف المشتق اعلن عنه بواسطة التركيب ( )structففري هرذ الحالرة فران المحردد سريكون عرام برالافترا فري حالرة غيراب محردد الوصرول الخرارجي، وعندما يكون محردد الوصرول للصرنف الاسراس هرو عرام ،فران كرل الاعضراء العامرة للصنف الاساس ستكون اعضاء عامة في الصنف المشتق ،وكرل الاعضراء المحميرة للصرنف الاسراس تصربح اعضراء محميرة للصرنف المشرتق .فري كرل الاحروال ،فران العناصر الخاصة للصرنف الاسراس تبقرى خاصرة للصرنف الاسراس ولا يرتم الوصرول لها من قبل اعضاء الصنف المشتق لاحظ الجدول .11.1 فري الجردول ( )11.1فران العمرود الرذي فري اقصرى اليسرار يمهرر قائمرة بحرق الوصول الممكن الى عناصر الصنف الاسراس الرذي ترم الاشرتقاق منره ،اي انره يبرين نوع البيانات والدوال فري الصرنف الاسراس (خراص ،عرام ،او محمري) ،بينمرا العمرود الثراني والثالر يبينران حرق الوصرول النراتج لعناصرر الصرنف الاعلرى عنردما يكرون 511
C++من البداية إلى البرمجة الكيانية الصرنف الثرانوي (المشرتق) معلنرا عنره علرى انره مشرتق خراص او عرام بالتعاقرب (اي نوع الوراثة). جدول :11.1حق الوصول لانواع الوراثة 21.4الوراثة المتعددة Multiple Inheritance فري لغرة C++فانره مرن المحتمرل جردا ان يررث صرنف اعضراء مرن اكثرر مرن صنف واحد .وهذا يتم ببساطة بفصل الصنوف الاساسية المختلفة بواسطة فارزة في اعلان الصنوف المشتقة. مثرال ،افرر لرديك صرنفا معينرا للطباعرة علرى الشاشرة اسرمة (،)COutput وتريرد ان تخلرق صرنوفا اخررى تسرميهما ( .)CRectangle and CTriangleوكران المطلرروب لهررذين الصررنفين ان يرثررا اعضرراء صررنف الطباعررة اضررافة الررى وراثررة ماموجود في الصنف ( ،)CPolygonفمن الممكن كتابتها: ;class CRectangle: public CPolygon ،public COutput ; class CTriangle: public CPolygon ،public COutput هنا من الممكرن ان يمثرل بعرالم الصرنوف بالصرنف ( )CPolygonبحير يشرتق منه الاثنان الاخريان (.)CTriangle ،CRectangle 512
د .نضال خضير العبادي /جامعة الكوفة [email protected] . شكل 21.2الصنف الاساس والاصناف المشتقة منه ان الصرنف ( )Polygonسروف يحتروي الاعضراء التري هري عامرة لكرلا نروعي متعدد الاضلاع ،في هذ الحالة :العرر والارتفراع ) (width, and heightوسرتكون ) )CRectangle, CTriangleاصرنافها المشرتقة ،مرع صرفات خاصرة تختلرف برين نروع واخر من متعدد الاضلاع. ان كيانررات الاصررناف (( )CRectangle and CTriangleكررل منهررا يحترروي اعضاء تم وراثتها من ( )CPolygonوالتي هي ))((width, height, set_values • برنامج لايجاد مساحة مثلث ومستطيل يرث وفات من ونف اخر // Example 10.1 >#include <iostream ;using namespace std { class CPolygon protected: ;int width َ height public: )void set_values (int a َ int b };{ width=a; height=b ;} { class CRectangle: public CPolygon public: 513
من البداية إلى البرمجة الكيانيةC++ int area ( ) { return (width * height); } }; class CTriangle: public CPolygon { public: int area ( ) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; rect.set_values (4, 5); trgl.set_values (4, 5); cout << rect.area( ) << endl; cout << trgl.area( ) << endl; return 0; } 21.2 نتيجة البرنامج 20 10 الفررق،)private( ) مشرابهة لمحردد الوصرولprotected) ان محردد الوصرول فران اعضراء الصرنف، فعندما يرث صنفا من صرنف اخرر،الوحيد يحدث في الوراثة ) الموروثة من الصرنفprotected( المشتق بامكانها ان تصل الى الاعضاء المحمية 514
د .نضال خضير العبادي /جامعة الكوفة [email protected] . الاساس ،ولكن لايمكنها ان تصل الى اعضائة الخاصة ) ،)privateوحي انرك ربمرا ترغررب ان تصررل الررى ( )height ،widthبواسررطة اعضرراء الصررنف المشررتق ( )CRectangle and CTriangleولريب فقرط يكرون الوصرول اليهرا بواسرطة اعضراء ( ،)CPolygonلذلك يفضل استخدام ( )protectedبدلا من ).(private بامكران تلخريص انرواع الوصرول المختلفرة وفقرا الرى مرن يمكنره الوصرول اليهرا وكما يأتي: جدول( :)21.2انواع الوصول العام المحمي الخاص الوصول private protected public Access الاعضاء من نفب الصنف نعم نعم نعم الاعضاء من الصنوف المشتقة نعم نعم لا نعم لا لا ليست اعضاء حي ان عبارة ليست اعضاء تمثل أي وصرول مرن خرارج الصرنف ،مثرل مرن ()( ،)mainمن صنف اخر ,او من دالة .في المثال ،11.1فران الاعضراء التري ورثتهرا الاصرناف ( )CRectangle and CTriangleلهرا نفرب سرماحية الوصرول كمرا كران عندهم في صنفهم الاساس (:)CPolygon CPolygon::width // protected access CRectangle::width // protected access )(CPolygon::set_values // public access )(CRectangle::set_values // public access وهذا يعود الى استخدام الكلمة المفتاحية ( )publicلتعريف علاقرة الوراثرة فري كل من الاصناف المشتقة: } class CRectangle: public CPolygon { ... هررذ الكلمررة المفتاحيررة ) )publicبعررد الفررارزتين المتعامرردتين ( ):تشررير الررى مستوى الوصول الادنى لكل الاعضاء الموروثرة مرن الصرنف (الاسراس) الرذي يتبرع 515
C++من البداية إلى البرمجة الكيانية النقطترين المتعامردتين (فري هرذ الحالرة .)CPolygonوحير ان ) (publicهري مرن اكثرر مسرتويات الوصرول ،لرذلك بتحديرد هرذ الكلمرة المفتاحيرة فران الصرنف المشرتق سوف يرث كل الاعضاء التي بنفب المستويات وهي موجودة في الصنف الاساس. امررا اذا تررم تحديررد مسررتوى وصررول اكثررر تقييررد مثررل ( ،(protectedفرران كررل الاعضاء العامة ( (publicللصرنف الاسراس سريتم توريثهرا كمحميرة ) (protectedفري الاصناف المشتقة ،بينما اذا حدد المستوى الاكثرر تقييردا فري كرل مسرتويات الوصرول ) ،(privateفان كل اعضاء الصنف الاساس ستورث كاعضاء خاصة (.(private مثرال ،اذا كران الصرنف ابنرة ( (daughterمشرتق مرن الصرنف الام )(mother والتي تعرف كما يأتي: ;class daughter: protected mother هررذ سرروف تحرردد ) (protectedكررأعلى مسررتوى وصررول لاعضرراء الصررنف ( )daughterوالتي ورثت من الام ( .(motherوعليه ،كرل الاعضراء التري هري عامرة في الصنف الام سوف تصبح محمية في الصنف الابنة .وبالطبع هرذا لايقيرد الصرنف الابنرة مرن الاعرلان عرن اعضراء خاصرة بهرا مرن النروع العرام ،لرذلك فران مسرتوى الوصول الاعمم يحدد فقط للاعضاء الموروثة من الام. اما اذا لم تحردد خارجيرا أي مسرتوى وصرول للوراثرة ،فران المتررجم سريفر المسرتوى الخراص ( )privateللاصرناف المعلرن عنهرا مرع الكلمرة المفتاحيرة )(class ويفر المستوى العام ( (publicلتلك المعلن عنها مع الكلمة المفتاحية (.(struct • برنوامج لايجواد نتيجوة رفوع عودد معوين الوى اس معوين موع مراعواة الاعولان عون الصنف المشتك على انه عام. // Example 10.2 >#include <iostream { class powe ;float x 516
د .نضال خضير العبادي /جامعة الكوفة [email protected] . public: } ;void set (float s) { x = s } ;void ptwo() { cout<<\"\\n\"<<x<<\" to power 2: \"<<x*x ;} { class mpow : public powe ;float y public: } ;mpow (float p) { y = p } ;void pthree() { cout<<\"\\n\"<<y<<\" to power 3: \"<<y*y*y ;} { )(int main ;)mpow ob(1.3 ;)ob.set(10 ;)(ob.ptwo ;)(ob.pthree ;return 0 } عنرردما يررورث صررنف اسرراس مسررتخدما محرردد الوصررول الخرراص ،فرران كررل الاعضاء العامة والمحمية للصنف الاساس تصبح اعضراء خاصرة للصرنف المشرتق. المثال التالي بالرغم من انه لايترجم بسبب ان ) )setو ( )poweهري اعضراء خاصرة في ،mpowلذلك لايتم الوصول لها بواسطة جزء البرنرامج خرارج الصرنف الاسراس والمشتق. • نفس البرنامج السابك 10.2مع الاعلان عن الصنف المشتك على انه خا //Example 10.3 >#include <iostream 517
من البداية إلى البرمجة الكيانيةC++ class powe { float x; public: void set (float s) { x = s; } void ptwo() { cout<<\"\\n\"<<x<<\" to power 2: \"<<x*x; } }; class mpow : private powe { float y; public: mpow (float p) { y = p; } void pthree() { cout<<\"\\n\"<<y<<\" to power 3: \"<<y*y*y; } }; int main() { mpow ob(1.3); ob.set(10); ob.ptwo(); ob.pthree(); return 0; } and ،Destructor ، Constructot والوراثوة، الهودم، دوال البنواء11.5 Inheritance مرن المهرم، هردم/كل من الاصناف الاساس والمشتقة ربمرا تحتروي دوال بنراء .ان تفهم متى تنفذ دوال البناء والهدم 518
د .نضال خضير العبادي /جامعة الكوفة [email protected] . دالرة البنراء تنفرذ عنردما يرتم خلرق كيران جديرد لصرنف معرين ،ودالرة الهردم تنفرذ عندما يتم ازالة كيان لصنف معين ،فعند خلق كيان لصنف مشتق ،عند ذلرك اذا كران الصنف الاساس يحتوي دالة بناء ،فسيتم استدعااها اولا متبوعة بدالرة بنراء الصرنف المشتق ،وعندما يتم هدم او ازالة كيان صنف مشتق ،فان دالة الهدم للصنف المشتق تستدعى اولا ثم تتبع بدالة الهدم للصنف الاساس اذا كانت موجودة .دوال البناء تنفرذ حسب ترتيبها في الاشتقاق .دوال الهدم تنفذ بعكب ترتيبها بالاشتقاق. • برنامج لطباعة عبارة توض متى استخدام دوال البناء والهدم // Example 10.4 >#include <iostream { class Sun public: } ;\"Sun( ) { cout<<\"\\nConstructing sun... } ;\"~Sun( ) {cout<<\"\\nDestructing sun... ;} { class Galaxy: public Sun public: } ;\"Galaxy( ) { cout<<\"\\nConstructing galaxy... } ;\"~Galaxy( ) {cout<<\"\\nDestructing galaxy... ;} { )(int main ;Galaxy ob ;return 0 } • برنامج لخلك وهدم عدد من الدوال في الاوناف الاساس والمشتقة // Example 10.5 519
من البداية إلى البرمجة الكيانيةC++ #include <iostream> class Sun { public: Sun() { cout<<\"\\nConstructing sun...\"; } ~Sun() {cout<<\"\\nDestructing sun...\";} }; class Moon { public: Moon() { cout<<\"\\nConstructing moon...\"; } ~Moon() {cout<<\"\\nDestructing moon...\";} }; class Galaxy1: public Sun َ public Moon { public: Galaxy1( ) { cout<<\"\\nConstructing galaxy1...\";} ~Galaxy1( ) {cout<<\"\\nDestructing galaxy1...\"; } }; class Galaxy2: public Moon َ public Sun { public: Galaxy2( ) { cout<<\"\\nConstructing galaxy2...\"; } ~Galaxy2( ) {cout<<\"\\nDestructing galaxy2...\"; } }; int main() { Galaxy1 ob1; Galaxy2 ob2; return 0; } تمرير وسائط لدوال البناء في الصنف الاساس21.5.2 521
د .نضال خضير العبادي /جامعة الكوفة [email protected] . لتمرير وسائط الى دالة البناء في الصنف الاساس يكون مرن الكرافي ان توسرع اعلان دالة بناء الصنف المشتق والذي يمرر وسائط لواحرد او اكثرر مرن دوال البنراء للصنف الاساس. الصيغة العامة للاعلان الموسع لدالة بناء الصنف المشتق هي: derived_constructor (argument-list) : base1 (argument_list) ، base2 )(argument_list) ،…..... baseN (argument_list { ... } • برنامج يجد مجموع اعداد بعد تربيع وتكعيب بعضها // Example 10.6 >#include <iostream >#include <math { class C1 protected: ;float x3 َ x2 public: { ) C1(float f1 َ float f2 ;)x3= pow (f1, 3.0 } ;)x2= pow (f2, 2.0 ;} { class C2: public C1 ;float x1 َ x0 public: )C2(float f1 َ float f2 َ float f3 َ float f4 ) : C1 (f4 َ f3 } ;{x0 = f1; x1 = f2 521
من البداية إلى البرمجة الكيانيةC++ float sum() { return (x3+x2+x1+x0); } void show() {cout<<\"\\nx3 + x2 + x1 + x0 = \"<<sum(); } }; int main() { C2 ob(-3, 2, 7, 9); ob.show(); return 0; } )• برنامج يمرر وسائط الى دالة البناء في الصنف الاساس (توسيع للبرنامج السابك // Example 10.7 #include <iostream> #include <math> class C1 { protected: float x5 َ x4; public: x4= pow(f2, 4.0); } C1 (float f1 َfloat f2) { x5= pow(f1, 5.0); }; class C2 { protected: float x3 َ x2; public: {x3 = pow (f1, 3); x2 = pow (f2, 2); } C2 (float f1 َ float f2) }; 522
د .نضال خضير العبادي /جامعة الكوفة [email protected] . { class C3: public C1 َ public C2 ;float x1 public: C3 (float f1 َ float f2 َ float f3 َ float f4 َ float f5): C1(f1 َf2) َ C2 )(f3 َf4 } ;{ x1 = f5 } ;)float sum() { return (x5+x4+x3+x2+x1 } ;)(void show() {cout<<\"\\n x5+x4+x3+x2+x1 = \"<<sum ;} { )(int main ;)C3 ob(-2 َ4 َ-6 َ8 َ-10 ;)(ob.show ;return 0 } الوسائط لدالة بناء الصنف الاساس تمررر بواسرطة وسرائط لدالرة بنراء الصرنف المشتق .لذا ،فحترى اذا كانرت دالرة بنراء الصرنف المشرتق لاتسرتخدم أي وسرائط ،فهري ستبقى تحتاج للاعلان عن واحدة من الوسائط اذا احتاج الصنف الاساس ذلك. • برنامج لايجاد مجموع عددين // Example 10.8 >#include <iostream { class C1 protected: ;float x public: } ; C1 (float f) { x = f 523
من البداية إلى البرمجة الكيانيةC++ }; class C2 { protected: float y; public: C2 (float f) { y = f ; } }; class C3: public C1 َpublic C2 { public: C3 (float f1 َfloat f2) : C1(f1) َ C2(f2) { } void show() {cout<<\"x+y: \"<< (x+y); } }; int main() { C3 ob(4, 5); ob.show(); return 0; } • برنامج يوض الوراثة الخاوة مع توضي فكرة التطابك // Example 10.9 class Pet { public: char eat() const { return 'a'; } int speak() const { return 2; } float sleep() const { return 3.0; } float sleep(int) const { return 4.0; } 524
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ;} class Goldfish : Pet { // Private inheritance public: ;Pet::eat // Name publicizes member ;Pet::sleep // Both overloaded members exposed ;} { )(int main ;Goldfish bob ;)(bob.eat ;)(bob.sleep !bob.sleep(1); // bob.speak(); // Error: private member function } ملاحظة//: عنردما تكرون هنرا وراثرة مرن النروع الخراص ،فران كرل الاعضراء العامرة للصنف الاساس تصبح خاصرة .فراذا كنرت ترغرب ان تجعرل اي مرنهم عرام ،فانرك تستطيع عمرل ذلرك وذلرك برذكر اسرماءها (بردون وسرائط او نروع اعرادة) فري حقرل الاعضاء العامة للصنف المشتق الوراثرة الخاصرة مفيردة اذا كنرت ترغرب ان تخفري جرزء مرن وظيفرة الصرنف الاساس. ملاحظة//: من الممكرن الوراثرة مرن صرنف واحرد ،لرذا يبردو مرن المنطرق ان تررث مرن اكثرررر مرررن صرررنف واحرررد فررري الوقرررت الواحرررد ( وراثرررة متعرررددة Multiple .)inheritance 525
C++من البداية إلى البرمجة الكيانية عنرد الحاجرة تسرتطيع فعرل ذلرك ،لكرن طالمرا الوراثرة المتعرددة هري منطقيرة كجرزء مرن التصرميم فهري موضروع يحترراج الاعتنراء بره باسرتمرار .واحردة مررن الامور التي نتفق عليها بشركل عرام .عليرك ان لاتحراول ذلرك لحرين ان ترتمكن مرن البرمجة بشكل جيد وتفهم اللغرة مرن خلالهرا .فري ذلرك الوقرت ،فانرك مرن المحتمرل سرتدر انره لريب مرن المهرم كرم تعتقرد بشركل مطلرق يجرب ان تسرتخدم الوراثررة المتعددة ،ولكن ستدر انك قادر على الاغلب ودائما ان تجرد طريقرة مرع الوراثرة المفردة. مبدئيا ،الوراثة المتعرددة تبردو بسريطة بدرجرة كافيرة :فهري تضريف اصرناف اكثرر الرى قائمرة الصرنف الاسراس خرلال الوراثرة ،مفصرولة بفرارزة .علرى كرل، الوراثة المتعددة تقدم عدد من احتمالات الغمو . 21.6الودوال التوي لاتوورث اليوا Functions that don’t Automatically Inherit ليب كل الردوال ترورث اليرا مرن الصرنف الاسراس الرى الصرنف المشرتق .دوال البناء والهدم تتعامل مع خلق وهدم أي كيان ،وهم يعلمون (الدوال) ماذا يعملرون مرع سمات الكيان ,وفقط لذلك الصنف المحدد ،لذا فران كرل دوال البنراء والهردم فري البنراء الهرمري اسرفل منهرا يجرب ان تسرتدعيها ،ان دوال البنراء والهردم لاترورث ويجرب ان تخلق خصيصا لكل صنف مشرتق .بالاضرافة لرذلك ،فران العامرل (=) لايرورث وذلرك لانه يؤدي الى نشاط مشابهة لدالة البناء .ذلك ،فقط لانك تعررف كيرف يرتم اسرناد كرل الاعضاء لكيان ما في الجانب الايمن من المساواة الى كيان في الجانب الايسرر فهرذا لايعني ان عملية الاسناد سوف يبقى لها نفب المعنى بعد الوراثة. مبدئيا ،الصنف المشتق يرث كل اعضاء الصنف الاساس ماعدا مايأتي: • دوال البناء والهدم للصنف الاساس • عواملها = () الاعضاء 526
د .نضال خضير العبادي /جامعة الكوفة [email protected] . • اودقائها بالرغم من ان دوال البناء والهدم للصنف الاسراس لاترورث بنفسرها ،فران دالرة بنائهرا الافتراضرية (بمعنرى دالرة بنائهرا بردون الوسرائط) ودالرة هردمها تسرتدعى دائمرا عندما يتم خلق كيان جديد او هدمة في الصرنف المشرتق ،فراذا كران الصرنف الاسراس ليب له دالة بنراء افتراضرية او انرك تريرد اسرتدعاء دالرة بنراء مطابقرة عنرد خلرق كيران مشتق ،فانه يمكنك ان تحددة في تعريف كل دالة بناء للصنف المشتق: derived_constructor_name (parameters): base_constructor_name }(parameters) {... • برنامج يوض دوال البناء والاوناف المشتقة ،البرنامج يوض العلاقوات العائليوة بين الام ،الابن والبنت. // Example 10.10 >#include <iostream ;using namespace std { class Mother public: ) ( Mother } ;\"{ cout << \"mother: no parameters\\n )Mother (int a } ;\"{ cout << \"mother: int parameter\\n ;} { class Daughter : public Mother public: )Daughter (int a } ;\"{ cout << \"daughter: int parameter\\n\\n ;} 527
C++من البداية إلى البرمجة الكيانية { class Son : public Mother public: )Son (int a) : Mother (a } ;\"{ cout << \"son: int parameter\\n\\n ;} {)( int main ;)Daughter zaynab (0 ;)Son ahmed(0 ;return 0 } نتيجة البرنامج 21.21 mother: no parameters daughter: int parameter mother: int parameter son: int parameter 11.7دوال التجاوز Overriding Functions مرن الممكرن تجراوز الصرنف الاسراس .دالرة التجراوز تعنري تغييرر التنفيرذ لدالرة الصنف الاسراس فري الصرنف المشرتق .فعنردما تخلرق كيانرا مرن الصرنف المشرتق فران الدالة الصحيحة سوف تستدعى. اما عندما تستخدم دالة تجاوز ،فيجب ان تتفق او تتطابق بنوع الاعادة وهيكل البرنامج مع الدالة في الصنف الاساس .هيكل البرنامج ( )signatureهو شركل الدالرة البرمجي او الوظيفي ماعدا نروع الاعرادة ،مثرل اسرم الدالرة ،قائمرة الوسرائط ،والكلمرة المفتاحية ) (constاذا استخدمت. 528
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ملاحظة//: عندما يخلرق الصرنف المشرتق دالرة مرع نفرب نروع الاعرادة وهيكليرة برمجرة كدالة عضو في الصرنف الاسراس ،ولكرن مرع تنفيرذ جديرد ،فيقرال لهرا تتجراوز هرذ الدالة. • برنووووامج يوضوووو مايحوووودث اذا تجوووواوز الصوووونف Dogالدالووووة ( )Speakفووووي ( Mammalاللبوووائن) .وللاختصوووار فوووان دوال الوووووول تركوووت خوووارج تلووو الصنوف. //Example 10.11 >#include <iostream enum BREED { YORKIE ، CAIRN ، DANDIE ، SHETLAND ، ;} DOBERMAN ، LAB class Mammal { public: // constructors } ;\"Mammal() { cout << \"Mammal constructor...\\n } ;\"~Mammal() { cout << \"Mammal destructor...\\n دوال ا رى// } ;\"void Speak( ) const { cout << \"Mammal sound!\\n } ;\"void Sleep( ) const { cout << \"shhh. I'm sleeping.\\n protected: ;int itsAge ;int itsWeight ;} class Dog : public Mammal 529
من البداية إلى البرمجة الكيانيةC++ { public: // دوال بناء Dog(){ cout << \"Dog constructor...\\n\"; } ~Dog(){ cout << \"Dog destructor...\\n\"; } // دوال ا رى void WagTail ( ) { cout << \"Tail wagging...\\n\"; } void BegForFood ( ) { cout << \"Begging for food...\\n\"; } void Speak( ) const { cout << \"Woof!\\n\"; } private: BREED itsBreed; }; int main() { Mammal bigAnimal; Dog fido; bigAnimal.Speak(); fido.Speak(); return 0; } 21.22 نتيجة البرنامج Output: Mammal constructor... Mammal constructor... Dog constructor... 531
د .نضال خضير العبادي /جامعة الكوفة [email protected] . !Mammal sound !Woof Dog destructor... Mammal destructor... Mammal destructor... 21.8تعدد الأشكال Polymorphism قبرل ان تردخل فري هرذا القسرم ،فاننرا نصرحك ان تكرون قرد فهمرت بشركل جيرد المؤشررات ووراثرة الصرنف .فراذا كانرت أي مرن العبرارات التاليرة تبردو لرك غريبرة، فعليك ان تعيد قراءة هذ المواضيع في الفصل الخاص بها: Statement: Explained in: ;}{ )int a::b(c Classes Pointers a->b ;class a: public b Friendship and inheritance 11.8.1المؤشرات الى الصنف الأساس Pointers to Base Class واحدة من الصفات المفتاحيرة للاصرناف المشرتقة هرو ان المؤشرر الرى الصرنف المشتق يكون من النوع الذي يتفق مع المؤشرر الرى الصرنف الأسراس .تعردد الأشركال هو فن استخدام مميزات هذ الصفة البسيطة متعددة الاستخدام. • برنامج يعيد كتابة برنامج المستطيل والمثلث اخ ين بنظر الاعتبار خاووية توافوك المؤشر. // Example 10.12 >#include <iostream ;using namespace std { class CPolygon 531
من البداية إلى البرمجة الكيانيةC++ protected: int width َheight; public: void set_values (int a َ int b) { width=a; height =b; } }; class CRectangle: public CPolygon { public: int area () { return (width * height); } }; class CTriangle: public CPolygon { public: int area () { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); cout << rect.area() << endl; cout << trgl.area() << endl; return 0; 532
د .نضال خضير العبادي /جامعة الكوفة [email protected] . } نتيجة البرنامج 21.21 20 10 فري الدالرة الرئيسرة ،ترم خلرق مؤشرران واللرذان يؤشرران الرى كيانرات الصرنف ( )CPolygonوهمرا ( .)ppoly1, and ppoly2عليره ستسرند مرجعيرات للمسرتطيل والمثلررر الرررى هرررذ المؤشررررات ،ولان كليهمرررا هرررو كيررران لاصرررناف مشرررتقة مرررن ( )CPolygonفان كلا الأسنادين مقبول. التحديرد الوحيرد فري اسرتخدام ) (*ppoly1 and *ppoly2بردلا مرن المسرتطيل والمثلرر ( )rect and trglهررو ان كررلا المؤشرررين مررن نرروع (* )CPolygonعليرره فانررررره يمكنررررررك فقررررررط اسررررررتخدام هررررررذين المؤشرررررررين للاشررررررارة الررررررى الاعضرررررراء ) (CRectangle, and CTriangleوالترري ترررث مررن ( .)CPolygonلهررذا السرربب فعنرردما تسررتدعي اعضرراء ()( )areaفرري نهايررة البرنررامج فانررك ستسررتخدم الكيانررات ) (rect, and trglمباشرة بدلا من المؤشرين ).(ppoly1, and ppoly2 ولغرر اسرتخدام ()( )areaمرع المؤشررات للصرنف ) ،(CPolygonفران هرذا العضو يجب ان يعلرن عنره ايضرا فري الصرنف ( )CPolygonولريب فقرط فري أصرنافة المشرتقة ،لكرن المشركلة ان ) (CRectangle, and CTriangleينفرذان نسر مختلفرة مرن ) ،(areaلذلك لايمكنك ان تنفذ في الصنف الاساس .هرذا يكرون ممكرن عنردما تصربح الأعضاء الافتراضية مساعدة. * تعدد الاشكال Polymorphism تعدد الاشكال تشير الى القابلية على اشترا عدة معراني لاسرم الدالرة الواحردة. ان تعرردد الاشرركال تشررير الررى القرردرة علررى اشررترا عرردة معرراني لاسررم دالررة واحرردة باستخدام الية تسمى (الربط المتاخر) (.)late binding * الربط المتاخر Late Binding 533
C++من البداية إلى البرمجة الكيانية الدالررة الافتراضررية هرري احررد انواعهررا ،برربعض المفرراهيم ربمررا تسررتخدم قبررل التعريرف .مثرال ،برنرامج الرسروم ربمرا يكررون لهرا عردد مرن انرواع الاشركال ،مثررل المسرتطيل ،الردائر ،الاشركال البيضروية وهكرذا .كرل شركل ممكرن ان يكرون كيانرا لصررنف مختلررف .مثررال ،صررنف المسررتطيل ( )Rectangle classربمررا يكررون لهررا متغيررات اعضراء للارتفراع ،العرر ،ونقطرة المركرز ،بينمرا صرنف الردائر ربمرا يكون لها متغيرات اعضاء لنقطة المركز ،ونصف القطر. الان افر انك تريد ان تكتب دالة ترسم شكل على الشاشة لنقل رسم دائررة، فانك تحتاج الى ايعازات مختلفة عن تلرك التري تحتاجهرا لرسرم مسرتطيل مرثلا .عليره، كل صنف يحتاج الى دوال مختلفة لرسم شركلة الخراص بره .وبسربب ان الردوال تعرود الى الصنوف ،فانه من الممكن ان ندعوها جميعا بالاسم ( .)Drawفاذا كان ( )rكيان مستطيل وكان ( )cكيان دائرة ،عليه فان ( )()c.draw()، and r.Draw من الممكن ان تكون دوال تنفذ مع شفرات مختلفة ،كل هرذا لريب جيردا ،ولكرن الان سوف نذهب الى شيء جديرد :الردوال الافتراضرية ( )Virtual functionsمعرفرة في صنف الاب (.)Figure الان الصرنف الاب ( )Figureربمرا يكرون لره دوال تطبرق علرى كرل الاشركال. مثال ،ربما يكون لها دالة تدعى ( )centerوالتي سرتحر الشركل الرى مركرز الشاشرة وذلك بمسحها واعادة رسمها في مركز الشاشة. Figure::centerربمرا تسرتخدم الدالرة ( )Drawلاعرادة رسرم الشركل فري مركرز الشاشررة .عنرردما نفكررر باسررتخدام الدالررة الموروثررة ( )centerمررع الاشرركال للصررنوف المستطيل والدائر ( )Circle ،Rectangleفانك سترى ان هنا تعقيدات هنا. لتوضيح هذ النقطة ،دعنا نفتر ان الصنف Figureقد تم كتابتة مسبقا وهو يستخدم ...وبوقت لاحق تم اضافة صنف من نوع جديد من ،Figureمثلا نسمية ( )Triangleلان المثل من الممكن ان يكون صنف مشتق من الصنف Figureوعليه فان الدالة ( )Centerسوف تطبق على كل المثلثات trianglesولكن 534
د .نضال خضير العبادي /جامعة الكوفة [email protected] . يوجد تعقيد .الدالة centerتستخدم Drawوالدالة Drawهي مختلفة لكل نوع من .Figureالدالة الموروثة ( centerاذا لايوجد شيء خاص يعمل) سوف تستخدم تعريف الدالة Drawالمعطى في الصنف Figureوالدالة Drawلاتعمل بشكل صحيح مع Triangleنحن نريد الدالة الموروثة centerلان تستخدم الدالة ( )Triangle::Drawاضافة الى الدالة ( )Figure::Drawولكن الصنف ()Triangle وبعدها الدالة ( )Triangle::Drawلم تكن قد كتبت عندما الدالة ( centerمعرفة بالصنف )Figureكتبت وترجمت! .كيف يمكن للدالة centerان تعمل بشكل صحيح مع Triangle؟ المترجم لايعرف اي شيء عن Triangle::Drawفي الوقت الذي تم ترجمة .centerالجواب :ان هذا من الممكن ان يطبق بتوفر Drawكدالة افتراضية تجهز تطبيق .فعندما تجعل دالة افتراضية فانك تخبر المترجم (انا لااعرف كيف تنفذ هذ الدالة .انتمر حتى يتم استخدامها في البرنامج ،وعليه احصل على حالة التنفيذ من حالة الكيان) ان تقنية الانتمار لحين وقت التنفيذ لتحديد التنفيذ للبرنامج الفرعي يدعى الربط المتاخر او الربط الالي ( late binding, or )dynamic bindingالدوال الافتراضية هي طريقة C++لتوفير الربط المتاخر. 4.18الدوال الافتراضية في Virtual Functions in C++ عضو الصنف الذي من الممكن ان يعراد تعريفرة فري اصرنافها المشرتقة يعررف بالعضو الافتراضي ) .(virtual membersولغر الاعلان عن عضو صنف (دالرة او بيانرات) علررى انرره افتراضرري ،فيجررب ان تسربق الاعررلان عنرره بالكلمررة المفتاحيررة ).(virtual • برنرررررامج يوضرررررح اسرررررتخدام الاعضررررراء الافتراضرررررية (نفرررررب برنرررررامج المستطيل والمثل ). // Example 10.13 >#include <iostream ;using namespace std { class CPolygon 535
من البداية إلى البرمجة الكيانيةC++ protected: int width َheight; public: void set_values (int a َint b) { width=a; height=b; } virtual int area () { return (0); } }; class CRectangle: public CPolygon { public: int area () { return (width * height); } }; class CTriangle: public CPolygon { public: int area () { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon poly; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; CPolygon * ppoly3 = &poly; 536
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ;)ppoly1->set_values (4,5 ;)ppoly2->set_values (4,5 ;)ppoly3->set_values (4,5 ;cout << ppoly1->area() << endl ;cout << ppoly2->area() << endl ;cout << ppoly3->area() << endl ;return 0 } نتيجة البرنامج 21.23 11 21 1 الان الاصررناف الررثلاث ) (CPolygon, CRectangle and CTriangleلهررا جميعا نفب الاعضاء: ))((width ،height ،set_value() and area الدالرة العضرو ))( (areaترم الاعررلان عنهرا فري الصررنف الاسراس علرى انهررا افتراضية وذلك لانه اعيد تعريفها لاحقا في كل صنف مشرتق .بالامكران التحقرق مرن هذ العملية ان رغبت وذلك بازالة الكلمة المفتاحية ) (virtualمن الاعلان عن الدالرة ()( )areaفي الصنف ( ،)CPolygonوبعدها نفذ البرنرامج سرتلاحظ ان النتيجرة تكرون صفر للاشكال الثلاث من متعدد الاضلاع بردلا مرن ( ،)1 ،11 ،21وذلرك بسربب انهرا بررردلا مرررن اسرررتدعاء دالرررة ( )areaالتررري تقابرررل كرررل كيررران ()(،CRectangle::area )( )and CPolygon::area() ،CTriangle()::areaعلى التوالي فانها ستسرتدعي الدالرة 537
C++من البداية إلى البرمجة الكيانية ()( )CPolygon::areaفي كل الحرالات التري يكرون فيهرا الاسرتدعاء بواسرطة المؤشرر الذي له النوع (*.)CPolygon عليره ،ان مراتقوم بره الكلمرة المفتاحيرة virtualهرو السرماا لاعضراء الصرنف المشررتق الترري لهررا نفررب الاسررم الررذي يحملرره عضررو فرري الصررنف الاسرراس لان يررتم استدعااها بشكل مناسب من المؤشر ،وبتحديرد اكثرر عنردما يكرون نروع المؤشرر هرو مؤشررر الررى الصررنف الاسرراس ولكنرره يؤشررر الررى كيرران للصررنف المشررتق ،كمررا فرري المثال 10.13 اي ونف ال ي يعلون عون او يورث دالوة افتراضوية يودعى ()polymorphic class لاحو علوى الورغ مون افتراضويتها ،فانو ايضوا قوادر للاعولان عون كيوان مون نووع ) (CPolygonولاستدعاء دالة ) (areaالخاوة به ،والتي تعيد وفر دائما. التجاوز Overriding عندما يتغير تعريف الدالرة الافتراضرية فري الصرنف المشرتق ،فران المبررمجين يقولون بان تعريرف الدالرة قرد تجراوز ) .(overrideفري C++فران هنرا تمييرز يحردث احيانرا برين المصرطلحات ) (override, and redefineفكرلا المصرطلحين يشرير الرى تغيير تعريف الدالة فري الصرنف المشرتق ،فراذا كانرت الدالرة افتراضرية فانهرا سرتدعى تجراوز ) (overrideامرا اذا كانرت الدالرة ليسرت افتراضرية فانهرا تردعى ) (redefine ربمرا تررى هرذا الاخرتلاف تافهرا بالنسربة لرك ،او للمبررمج ،وذلرك لانرك تعمرل نفرب الشيء بكلتا الحالتين ولكن بالنسبة للمترجم فان كل حالة تعامل بشكل مختلف. 11.11تجريد الاوناف الاساس Abstract Base Classes الاصناف الاساس المجرردة هري اشرياء مشرابهة جردا الرى صرنف )(CPolygon في مثالنا السابق .الفرق الوحيد هو انه في المثال السابق فانرك عرفرت دالرة ()()area 538
د .نضال خضير العبادي /جامعة الكوفة [email protected] . مقبولة مع الحد الأدنى من الوظائف للكيانرات التري كانرت مرن الصرنف ()CPolygon (مثل الكيان ،)polyبينما في الاصرناف الاسراس المجرردة فانره يمكنرك ان تترر هرذ الدالة العضو ) (areaدون تنفيذ علرى الأطرلاق .وهرذا يحردث باضرافة (( )= 0تسراوي صفر) الى اعلان الدالة. الصرنف الاسرراس المجررد ) (CPolygonممكررن ان يكرون مشررابها الرى مقطررع البرنامج التالي { class CPolygon protected: ;int width ،height public: )void set_values (int a ،int b } ;{ width=a; height=b ;virtual int area ( ) =0 ;} لاحرظ كيرف تمرت اضرافة ) (= 0الرى الدالرة الافتراضرية ))( (int areaبردلا مرن تحديرررد التنفيرررذ للدالرررة .هرررذا النررروع مرررن الررردوال يررردعى (الدالرررة الافتراضرررية النقيرررة ( ،)(pure) virtual functionوكل الاصناف التي تحتوي على الاقل دالة نقيرة واحردة هي اصناف اساس مجردة (.)abstract base classes الفرق الرئيب بين الصنف الاساس المجرد وصنف متعدد الاشكال الاعتيادي هو انه بسبب ان الاصناف الاساسية المجردة على الاقل واحد من اعضاءها ينقصرة التنفيذ فانه لايمكنك ان تخلق حالات (كيانات) منه. ولكن الصنف الذي لايمكن خلق كيانات منه ليب غير نافع كليا ،بالامكان ان تخلق مؤشرا اليه وتأخذ ميزات لكل امكانيات تعدد اشكالة .لذا فان الاعلان المشابهة الى: 539
C++من البداية إلى البرمجة الكيانية ;CPolygon poly سوف لايكون مقبولا للصنف الاساس المجرد والذي اعلنت عنره الان ،وذلرك لتوضيح الكيان .بدون شك الاعلان التالي ;CPolygon * ppoly1 ;CPolygon * ppoly2 سيكون مقبولا بشكل ممتاز. هرذا يعمررل طالمرا ) (CPolygonيحترروي دالرة افتراضررية نقيرة وبررذلك سرريكون صرنف اسراس مجررد .علرى كرل حرال ،المؤشرر الرى هرذا الصرنف الاسراس المجررد بالامكان ان يستخدم للتاشير للكيانات من الاصناف المشتقة. • برنررامج يوضررح اسررتخدام الصررنف الاسرراس المجرررد (اعررادة كتابررة برنررامج المستطيل والمثل ) // Example 10.14 >#include <iostream ;using namespace std { class CPolygon protected: ;int width َheight public: )void set_values (int a َint b } ;{ width=a; height=b ;virtual int area (void) =0 ;} { class CRectangle: public CPolygon public: 541
[email protected] . جامعة الكوفة/ نضال خضير العبادي.د int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl; return 0; } 21.24 نتيجة البرنامج 11 21 541
C++من البداية إلى البرمجة الكيانية أذا راجعرت البرنرامج 11.14فانرك سروف تلاحرظ بانرك اشررت الرى الكيانرات بشرركل مختلررف ولكررن الاصررناف ذات العلاقررة تسررتخدم نوعررا وحيرردا مررن المؤشررر )* (CPolygonهذا ممكن ان يكون مفيدا جدا. مثال ،الان يمكن ان تخلق عضو دالة للصنف الاسراس المجررد ()CPolygon والذي يكون قرادرا علرى الطباعرة علرى الشاشرة نترائج الدالرة ))( (areaحترى وان كران ) (CPolygonنفسه لاينفذ هذ الدالة. الاعضررراء الافتراضرررية والاصرررناف المجرررردة تمرررنح C++خصرررائص تعررردد الأشكال والتي تجعل البرمجة الكيانية اداة مفيدة في المشاريع الكبيرة .بالطبع ،رأيت استخدامات بسيطة جدا لهذ الصفات ،ولكن هذ الصفات من الممكن ان تطبق علرى مصفوفة من الكيانات او تخصيص الكيانات الألي. • برنرامج يتعامرل مرع كيانرات تخصرص اليرا .المثرال يوضرح امكانيرة اسرتدعاء اعضاء افترا نقي من الصنف الاساس المجرد // Example 10.15 >#include <iostream ;using namespace std { class CPolygon protected: ;int width َheight public: )void set_values (int a َint b } ;{ width=a; height=b ;virtual int area (void) =0 )void printarea (void } ;{ cout << this->area() << endl ;} 542
[email protected] . جامعة الكوفة/ نضال خضير العبادي.د class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CRectangle rect; CTriangle trgl; CPolygon * ppoly1 = ▭ CPolygon * ppoly2 = &trgl; ppoly1->set_values (4,5); ppoly2->set_values (4,5); ppoly1->printarea(); ppoly2->printarea(); return 0; } 21.25 نتيجة البرنامج 11 21 • برنامج يوضح التخصيص الالي للذاكرة وتعدد الاشكال 543
من البداية إلى البرمجة الكيانيةC++ // Example 10.16 #include <iostream> using namespace std; class CPolygon { protected: int width َheight; public: void set_values (int a َint b) { width=a; height=b; } virtual int area (void) =0; void printarea (void) { cout << this->area() << endl; } }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } }; int main () { CPolygon * ppoly1 = new CRectangle; CPolygon * ppoly2 = new CTriangle; 544
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ;)ppoly1->set_values (4,5 ;)ppoly2->set_values (4,5 ;)(ppoly1->printarea ;)(ppoly2->printarea ;delete ppoly1 ;delete ppoly2 ;return 0 } البرنامج 21.26 11 21 لاحظ المؤشرات ):(ppoly ;CPolygon * ppoly1 = new CRectangle CPolygon * ppoly2 = new CTriangle اعلن عنهرا علرى انهرا مرن نروع مؤشرر الرى ) (CPolygonولكرن الكيانرات التري خصصت اليا تم الاعلان عنها ولها نوع الصنف المشتق مباشرة. التجاوز هي عملية ابدال الطريقة او الدالة الموجودة فري الصرنف المشرتق مرع واحدة مناسبة اكثر للصنف الجديد. 545
C++من البداية إلى البرمجة الكيانية اسئلة للحل//: .1اكتب برنامج لتنفيذ الصنف الهرمي التالي: .2اكترب برنرامج لصرنف اسرم ,Nameلره كيانرات تشربة الشركل ادنرا ,ثرم حرور صرنف الشرخص فري السرؤال 6مرن الفصرل التاسرع ,بحير ان الاسم يكون له نوع اسم ) (Nameبدلا من نوع سلسلة حرفية. 546
د .نضال خضير العبادي /جامعة الكوفة [email protected] . الفصل الحادي عشر القوالأ TEMPLATES 22.2المقدمة القوالرب هري مثرل الوعراء ،بحير ان المتررجم يولرد عائلرة مرن الصرنوف او الرردوال .مبرردئيا ،القوالررب كانررت تعررر كررداعم لصررنوف الاحتررواء العامررة مثررل المصفوفات والقوائم .في السنين الاخيرة ،تجارب استخدام القوالب وضرحت ان هرذ الصرفة هري غالبرا مفيردة فري تصرميم وتنفيرذ مكتبرات الاغررا العامرة مثرل مكتبرة القوالرب القياسرية .مرع انتشرار اسرتخدام القوالرب فران C++اضرافت هياكرل معرفيرة للسيطرة على سلوكها وكفائتها ،متضمنة التخصص الجزئي ،التخصرص الخرارجي، اعضاء القوالب ،القوالب المصدرة ،انواع العوامل الافتراضية ،واكثر والتي سرناتي عليها بالتفصيل. 22.1تعريف القوالب Templates Define القوالب هي طريقة لكتابة دالة مفردة او صنف لعائلة من الردوال او الصرنوف المتشابهة وبطرق عامة. الكثير من تعاريف دوال C ++السابقة لها خوارزميات هي اكثر عمومية مرن الخوارزميات التي تم تداولها في تعريف الدوال. مثال :نفر دالة swap-valuesالتالية: )void swap_values (int &variable1 ،int &variable2 { ;int temp ; temp = variable1 ; variable1 = variable2 547
C++من البداية إلى البرمجة الكيانية ; variable2 = temp } لاحظ ان هذ الدالة تنفذ فقط على المتغيرات من نوع الاعداد الصحيحة .لحد الان الخوارزمية المعطاة في جسم الدالة ممكن فقط ان تستخدم لتبديل قيم المتغيرات مرن نروع الاعرداد الصرحيحة .فراذا كنرت ترغرب اسرتخدام الدالرة swap_valuesمرع متغيرات من نوع charايضا فانك يمكنك ان تطابق اسم الدالة .swap_valuesوذلك بكتابتها بالشكل التالي: )void swap_values (char &variable1 ،char &variable2 { ; char temp ; temp = variable1 ; variable1 = variable2 ; variable2 = temp } لكرن هنررا شرريء غيررر مرضرري وغيرر كفرروء حررول هررذين التعررريفين للدالررة ، swap_valuesفغالبا هما متشابهان والفررق الوحيرد هرو ان احرد التعرريفين يسرتخدم النروع intوالتعريرف الثراني يسرتخدم النروع charفري نفرب اماكنهرا .للتقردم فري هرذ الطريقرررة ،نفررررر انررررك اردت ان تطبرررق الدالررررة swap_valuesعلررررى زوج مررررن المتغيرات من نوع ،doubleسوف تحتاج الى كتابة تعريف دالرة ثالثرة علرى الاغلرب مشابهة لما سبق .واذا اردت ان تنفذ هذ الدالة على انرواع اخررى اكثرر فانره سريكون عند عدد من تعاريف الدوال المتشابهة وغالبا يكون كبير ،هرذا يتطلرب تعامرل جيرد مرع الانرواع وسروف يرؤدي الرى فوضرى بالشرفرة نمررا لكثررة التعراريف التري تبردو متشابة ..لكن يمكننا القول ان تعريف الدالة التالية ينفذ مع كل الانواع: 548
د .نضال خضير العبادي /جامعة الكوفة [email protected] . void swap_values (type-of-the-variables &variable1 ،type-of-the- )variables &variable2 { ; temp = variable1 ; variable1 = variable2 ; variable2 = temp } كما ترى من التعريف الاخير للدالرة ان هنرا امكانيرة لكتابرة دالرة عامرة حير من الممكن ان تعرف دالة واحدة تعمل على كل المتغيرات ،برالرغم مرن ان الصريغة القواعدية تختلف قليلا من تلك التي وضحت اعلا . في C++هذا من الممكن ان تقوم به باستخدام وسائط القالب. 22.3وسائط القالب Templates Parameters وسرائط القالرب هري نروع خراص مرن الوسرائط التري مرن الممكرن ان تسرتخدم لتمريرر نروع كعامرل او وسرريط ،بالضربط مثرل وسرائط الرردوال الاعتياديرة التري مررن الممكن ان تستخدم لتمرير قيم الى الدالرة ،وسرائط القالرب تسرمح ايضرا بتمريرر انرواع الى الدالة .قوالب الدوال هذ ممكن ان تستخدم كما لو كانت اي نوع اعتيادي اخر. 22.3.2الصيغة العامة للاعلان عن قوالب الدالة مع وسائط القالب هي: ; template <class identifier> function_declaration ; template <typename identifier> function_declaration ان الفرق الوحيد بين الاعلانين اعلا هو اسرتخدام الكلمرة المفتاحيرة classفري الأعرلان الأول ،والكلمرة المفتاحيرة typenameفري الأعرلان الثراني .اسرتخدامهم هرو للتمييز ،حي ان كلا التعبيرين لره بالضربط نفرب المعنرى ويتصررفان بالضربط برنفب الطريقة .من ذلك نرى ان القوالب نوعين تشمل: 549
C++من البداية إلى البرمجة الكيانية • قوالب الدوال Functions Templates • قوالب الصنوف Classes Templates 22.4قوالب الدوال Functions Templates كما بينا اعلا ان القوالب هري طريقرة لكتابرة دالرة مفرردة او صرنف لعائلرة مرن الدوال او الصنوف المتشابهة وبطرق عامة . فعند كتابة دالة مفردة لعائلة من الدوال المتشابهة فسوف تدعى (قالب الدالة). سررابقا تعرفررت علررى كيفيررة اسررتخدام التطررابق ( )overloadلنرروع متشررابة مررن العمليرات فري الفصرل الرابرع وتعلمرت كيفيرة تنفيرذها ،وتعريرف الردوال ،وكيرف يرتم استدعائها. ان عملية التطابق في الدوال تعتمد على استخدام ذات الاسم (اسم الدالرة) لكرل الدوال المراد لها التطابق على ان الشفرة يعاد كتابتها لكل دالة بطريقة مختلفرة ،فقرط اسماء الدوال هو نفسة لكن تعريف واعلان الدوال ممكن ان يتغير مثل Swap (char* ،char*) // تبديل اثنان من البيانات من نوع الرموز } { ………………. تبديل اثنان من البيانات من نوع الاعداد الصحيحة Swap (int ،int) // } { ……………….. تبديل اثنان من البيانات من نوع الاعداد الحقيقية Swap (float ،float) // } …………… { لغة C++توفر صفات معينة مع امكانيات لتعريف دالة مفردة لمجموعرة مرن الدوال المتشابهة .فعندما تكترب دالرة مفرردة لمجموعرة مرن الردوال المتشرابهة ،عنردها تسرمى قوالرب الدالرة ،الميرز او الحسرنة الرئيسرية لاسرتخدام قالرب الدالرة هرو تجنرب اسرتخدام التكررار غيرر الضرروري لشرفرة المصردر .ان شرفرة الكيران تصربح اكثررر 551
د .نضال خضير العبادي /جامعة الكوفة [email protected] . تماسكا واكثر كفراءة مرن الطررق الاعتياديرة لغرر الاعرلان وتعريرف الدالرة ،كرذلك تمطلع بفحص نوع البيانات الكامل. ان قالب الدالة لا يحدد انواع البيانات الحقيقية للوسائط التي تقبلها الدالرة لكنهرا تستخدم عادة العمومية او الوسائط فري قوالرب الدالرة حير يوجرد علرى الاقرل وسريط رسمي ( )formalواحد يكون عام .الصيغة القواعدية العامة ل علان عن قالب دالرة في لغة C++هي: )template < class T > T function-name (T formal arguments …………………………………… { ; )return (T } حيرر ان كلمررة ( )templateو ( )classهرري كلمررات مفتاحيررة فرري لغررة،C++ ويجررب ان يبرردأ القالررب بالكلمررة المفتاحيررة ( )templateامررا (( )Tفهررو نرروع بيانررات الوسائط ( .الاعلان اعلا لقالب الدالة ممكن ان يكتب بالصيغة التالية ايضا > template < class T )T function-name (T formal arguments { …………………. } ; )return (T المسرتخدم ربمرا يكرون متشروق لمعرفرة كيفيرة تخصريص نروع الوسرائط ،مرع ملاحمرة ان النروع المعراد للدالرة لايأخرذ بنمرر الاعتبرار ابردا انرواع بيانرات الوسرائط الحقيقية التي تعالج . نوع البيانات الحقيقية للدالة تتطابق مع الوسائط الرسمية لاعرلان الدالرة طالمرا ان الوسائط تستخدم في قالب الدالة. 551
C++من البداية إلى البرمجة الكيانية 11.5القوالب Templates البرنامج ادنا يوضح قالب C++للدالة ,swap_valuesقالب الدالرة هرذا يسرمح لك لتبديل قيم متغيرين لاي نوع ،طالمرا هرذان المتغيرران لهمرا نفرب النروع .تعريرف واعلان الدالة يبدأ بالسطر >template < class T وهذ تدعى قوالب بادئة template prefixوهي تخبر المترجم بان التعريرف/ او الاعلان عن الدالة الذي يتبع هو قالب وان الرمز ( )Tهو وسريط النروع ،فري هرذا السياق فان العبرارة ( )classحقيقرة النروع( .فري الحقيقرة ان ANSIالقياسرية تروفر لرك امكانية استخدام الكلمة المفتاحية ( )type-nameبدلا من ( )classفري قالرب )،(prefix بالرغم من اننا يجب ان نتفق بان استخدام ( )type-nameيجعلهرا اكثرر وضروحا بردلا من استخدام الصنف ).(class لاحظ هنا ان وسيط النوع ( )Tمن الممكن ان يعو باي نوع ،بغض النمرر فيمرا اذا كران النروع صرنف او لا .داخرل جسرم تعريرف الدالرة فران وسريط النروع ()T يستخدم فقط مثل اي نوع اخر. تعريف قالب الدالة هو في الواقع تجميع كبير لتعاريف الدالة. بالنسربه لقالرب الدالرة للدالرة swap_valuesالمبينرة فري قطعرة البرنرامج ادنرا ، هنا في الواقرع تعريرف دالرة واحردة لكرل اسرم نروع محتمرل ،كرل مرن هرذ التعراريف تحصل عليه بابدال وسيط النوع ( )Tباسم اي نوع. مثررال ،تعريررف الدالررة التررالي تحصررل عليرره وذلررك بابرردال ( )Tباسررم النرروع ).(double )void swap_values (double &variable1 ،double &variable2 { ; double temp ; temp = variable1 552
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ; variable1 = variable2 ; variable2 = temp } كذلك يمكن الحصرول علرى تعريرف دالرة اخرر وذلرك بابردال وسريط النروع )(T باسم النوع .intوممكن ايضرا الحصرول علرى تعريرف اخرر بابردال وسريط النروع )(T باسرم النروع ,charان عمليرة الابردال تبردأ عنرد اسرتدعاء الدالرة حير يرتم تمريرر نروع المتغيرات وبالتالي سيتم ابدالها من قبل المترجم بدلا من Tفي جسم الدالة. ان قالرررب دالرررة واحرررد للدالرررة swap_valuesفررري البرنرررامج ) (11.1ذات اسرررم متطابق ،وبذلك سيكون هنا تعريف دالة مختلف قليلا لكل نوع ممكن. المترررجم سرروف لاينررتج تعريررف لكررل نرروع ممكررن او محتمررل لاسررم الدالررة swap_valuesولكنره سروف يتصررف بالضربط كمرا لرو انره انرتج كرل تعراريف تلرك الدوال .تعريف منفصل واحد سوف ينتج لكل نوع مختلف من الأنواع التري تسرتخدم القالب ،ولكن ليب للانواع التي لم تستخدم القالب .فقط تعريف واحد يتولرد لكرل نروع مفرد بغض النمر عن عدد المرات التي يتم فيها استخدام القالب لذلك النوع. • برنامج لابدال قيمة متغيرين احدهما بدل الاخر Example 11.1 >#include<iostream ;using namespace std >template<class T )void swap_values (T &variable1 َT &variable2 { ; T temp ; temp = variable1 ; variable1 = variable2 } ; variable2 = temp {)(int main ; int integer1 َinteger2 << \" \" << cout<< “ Original integer values are” <<integer1 ; integer2 << endl ; )swap_values (integer1 َinteger2 553
C++من البداية إلى البرمجة الكيانية \" \"<< cout<<”Swapped integer values are “<< integer1 ; <<integer2 << endl ; ’char symbol1 = ‘A’ َsymbol2 = ‘B << \" \" << cout << “ Original character values are “ << symbol1 ; symbol2 << endl ; ) swap_values (symbol1 َsymbol2 << \" \" <<cout<< “ Swapped character values are” << symbol1 ; symbol2<<endl ; return 0 } مطرجا البرنامج 22.2 Original integer values are 12 Swapped integer values are 21 Original character values are A B Swapped character values are B A لاحررظ فرري البرنررامج اعررلا تررم اسررتدعاء الدالررة swap_valuesمرررتين مرررة للوسائط من النوع intومرة اخرى للوسائط من النوع .charفعند الاستدعاء الاول ; )Swap_values(integer1 ،integer2 حيررر سررريتم اسرررتدعاء القالرررب ويبررردل ) (Tبالعررردد الصرررحيح ونفرررب الشررريء بالاسرتدعاء الثراني حير يبردل ( )Tبرالرمز وهكرذا .لاحرظ انرك لاتحتراج ان تعمرل اي شيء خاص عند استدعاء دالة معرفة مع قالب دالة ،انك تستدعيها كما تفعرل مرع اي دالة اخرى ،المترجم يقوم بكل العمل لانتاج تعريف الدالة من قالب الدالة. فري البرنرامج 11.1وضرع تعريرف قالرب الدالرة قبرل الدالرة الرئيسرية mainفري البرنامج ولم يستخدم اعلان دالة القالب .دالة القالب ربما يكون لها اعلان دالرة ،كمرا في الدوال الاعتيادية. 554
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 550
- 551 - 600
- 601 - 632
Pages: