۱۱ مطلب در اسفند ۱۳۹۳ ثبت شده است

ارث بری چند گانه (Multiple Inheritance)

سلام!

در جلسات قبل با مفهوم ارث بری آشنا شدیم. حالا می خواهیم با مفهوم ارث بری چند گانه آشنا شویم.

یک هاورکرافت را در نظر بگیرید. این وسیله هم یک وسیله ی نقلیه ی زمینی است و هم یک وسیله ی نقلیه ی آبی. پس ویژگی های این دو را به ارث می برد. در واقع دو کلاس پایه برای هاورکرافت وجود دارد. کد آن شبیه کد زیر می شود؛

class HoverCraft : public LandVehicle , public WaterVehicle;
۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی

تغییر عضوهای کلاس پایه از طریق کلاس وارث

سلام!

در این جلسه می خواهیم توابع موجود در کلاس پایه و سطح دسترسی به عضوهای کلاس پایه را تغییر دهیم.

فرض کنید در کلاس پایه ی خود یک تابع به نام test دارید و در کلاس وارث چنین تابعی ندارید. اگر در برنامه ی خود بنویسید

Derived_Obj.test();

کامپایلر ابتدا در خود کلاس وارث دنبال تابع test می گردد و اگر پیدا نکند، در زنجیره ی ارث بری به سمت بالا حرکت می کند تا چنین تابعی را پیدا کند. حالا کد زیر را در نظر بگیرید. همان طور که می بینید، تابع identify را چه با کلاس پایه و چه با کلاس وارث صدا بزنیم، یک تابع صدا زده می شود و آن هم تابع identify در کلاس پایه است.

#include <iostream>

using namespace std;

class Base{
    protected:
        
        int foo;
    
    public:
        
        Base( int value = 0 ) : foo( value ) {}
        
        void identify();
        
};

void Base::identify(){
    cout << "Base!\n";
}

class Derived : public Base{
    public:
        
        Derived( int value = 0 ) : Base( value ) {}
        
};

int main(){
    Base base;
    base.identify();
    
    Derived derived;
    derived.identify();
}

این نکته که بدیهی بود، حالا می خواهیم این تابع را تغییر دهیم.

۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی

استفاده از توابع سازنده ی کلاس پایه

سلام!

این جلسه می خواهیم به طرز عمل کرد توابع سازنده (costructor) در کلاس های پایه و وارث بپردازیم.

به تابع سازنده ی کلاس Student در برنامه ی زیر دقّت کنید. در این تابع با کمک لیست مقداردهی تابع سازنده ی کلاس پایه (Adam) را صدا زدیم.

#include <string>

using namespace std;

class Adam{
    protected:
        string _name;
        int _age;
        double _height;
    public:
        
        Adam( string name = "", int age = 0, double height = 0 ) : _name(name), _age(age), _height(height) {}

        string name();
        int age();
        double height();

        void setName( string );
        void setAge( int );
        void setHeight( double );

};

string Adam::name(){
    return this->_name;
}

int Adam::age(){
    return this->_age;
}

double Adam::height(){
    return this->_height;
}

void Adam::setName( string name ){
    this->_name = name;
}

void Adam::setAge( int age ){
    this->_age = age;
}

void Adam::setHeight( double height ){
    this->_height = height;
}

class Student : public Adam{
    private:
        int _id;
    public:
        
        Student( string = "", int = 0, double = 0, int = 0 );

        int id();

        void setID( int );

};

Student::Student( string name, int age, double height, int id ) : Adam( name, age, height) , _id( id ){}

int Student::id(){
    return this->_id;
}

void Student::setID( int id ){
    this->_id = id;
}

int main(){
    Student std( "John Smith", 20, 180, 174 );
    return 0;
}

یک راه دیگر برای مقدار دهی عضوهای کلاس پایه را می توانید در کد زیر مشاهده کنید.

Student::Student( string name, int age, double height, int id ) : _id( id ){
this->setName( name );
this->setAge( age );
this->setHeight( height );
}

توجّه! شما نمی توانید به عضوهای کلاس پایه از طریق لیست مقداردهی، مقدار دهید. در واقع مثال زیر غلط است:

Student::Student( string name, int age, double height, int id ) : _name( name ), _age( age), _height( height ), _id( id ) {}
۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی

ارث بری در کلاس ها (inheritance)

سلام!

این جلسه می خواهیم وارد مبحث خیلی مهم (خیلی مهم) و جدیدی در برنامه نویسی شی گرا شویم. این مبحث، ارث بری نامیده می شود.

فرض کنید می خواهید برنامه ای بنویسید که قرار است در آن از شکل های هندسی (مثل مربّع، مستطیل و...) استفاده کنید. تمام شکل های هندسی در یک چیز مشترکند؛ در شکل بودن. هم مربّع یک شکل است، هم مستطیل یک شکل است و هم تمام شکل های دیگر.

حالا باید با دو مفهوم Base class (کلاس پایه) و Derived class (کلاس مشتق شده) آشنا شوید. به کلاسی مانند کلاس Shape (در مثال بالا) یک کلاس پایه یا Base class می گویند. به کلاس های مربّع، مستطیل و... کلاس های وارث، مشتق شده یا Derived class می گویند.

۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی

آموزش ایجاد یک Makefile

سلام!

جلسه ی پیش با فایل هایی با پسوند o (مثل Point.o) آشنا شدیم. حالا می خواهیم برنامه ای بنویسیم که خودش به صورت خودکار تمامی کد ها را کامپایل کند. برای این کار باید ابتدا برنامه ای به نام make را نصب کنیم. برای نصب این برنامه در Ubuntu باید دستور زیر را در Terminal وارد کنید؛

sudo apt-get install make

حالا باید برنامه ای سازگار با این برنامه بنویسیم. بعد از این که این کار را انجام دادیم، دیگر لازم نیست همه ی دستور های لازم را برای کامپایل بنویسیم بلکه تنها وارد Folder برنامه ها شده و در Terminal می نویسیم:

make

همین برای کامپایل کامل برنامه کافی خواهد بود. حال بیایید به طرز نوشتن فایل Makefile بپردازیم.

۱ نظر موافقین ۱ مخالفین ۰
روزبه صیادی

استفاده از فایل .h و .cpp در class ها

سلام!

برای این که خستگی مبحث سربارگذاری عمل گر ها (که آن را در شش جلسه به پایان رساندیم) از تن تان بیرون برود، یک مبحث بسیار ساده ولی مهم را آموزش می دهیم.

فرض کنید که چند class را پیاده سازی کرده اید و حالا می خواهید از همه ی آن ها در برنامه ی خود استفاده کنید. اگر کد همه ی آن ها را در برنامه ی اصلی خود copy کنید، برنامه تان خیلی شلوغ می شود؛ برای همین بهتر است class ها را در فایل های جداگانه پیاده سازی کنید و سپس از آن فایل ها در برنامه ی خود استفاده کنید.

۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی

پاسخ تمرین سری قبل

سلام!

پاسخ تمرین سری قبل را می توانید در کد زیر مشاهده نمایید.

۰ نظر موافقین ۰ مخالفین ۰
روزبه صیادی