سلام!

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

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

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

بیایید با یک مثال ساده برای ارث بری شروع کنیم. فرض کنید یک کلاس به نام Adam دارید و حالا می خواهید یک کلاس هم به نام Employee بسازید که تمامی ویژگی های یک آدم را هم دارد. اوّل از همه یک کلاس ابتدایی برای Adam می نویسید. چیزی شبیه کد زیر.

class Adam{
    private:
        double _height, _weight, _age;
    public:
        
        Adam(double = 0, double = 0, double = 0);

        double height() const;
        double weight() const;
        double age() const;

        void setHeight( double );
        void setWeight( double );
        void setAge( double );

};

Adam::Adam( double height, double weight, double age ){
    this->setHeight( height );
    this->setWeight( weight );
    this->setAge( age );
}

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

double Adam::weight() const{
    return this->_weight;
}

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

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

void Adam::setWeight( double weight ){
    this->_weight = weight;
}

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

حالا می خواهیم کاری کنیم که کلاس Employee تمامی ویژگی های کلاس Adam را به ارث ببرد. برای این کار می توانیم بنویسیم

class Employee : public Adam{
};

حالا در کد زیر، کلاس Employee را به عنوان یک وارث کلاس Adam تعریف کرده ایم.

 

class Adam{
    private:
        double _height, _weight, _age;
    public:
        
        Adam(double = 0, double = 0, double = 0);

        double height() const;
        double weight() const;
        double age() const;

        void setHeight( double );
        void setWeight( double );
        void setAge( double );

};

Adam::Adam( double height, double weight, double age ){
    this->setHeight( height );
    this->setWeight( weight );
    this->setAge( age );
}

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

double Adam::weight() const{
    return this->_weight;
}

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

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

void Adam::setWeight( double weight ){
    this->_weight = weight;
}

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

class Employee : public Adam{
    private:
        double _salary;
        int _ID;
    public:
        
        Employee(int = 0, double = 0);

        double salary();
        int ID();

        void setSalary( double );
        void setID( int );

};

Employee::Employee( int ID, double salary ){
    this->setID( ID );
    this->setSalary( salary );
}

double Employee::salary(){
    return this->_salary;
}

int Employee::ID(){
    return this->_ID;
}

void Employee::setSalary( double salary ){
    this->_salary = salary;
}

void Employee::setID( int ID ){
    this->_ID = ID;
}

حالا می توانیم در کلاس Employee از عضوهای کلاس Adam هم استفاده کنیم. مثلا مثل کد زیر.

#include <iostream>

using namespace std;

int main(){
    Employee employee( 10, 126.44);
    employee.setHeight( 178 );
    return 0;
}

به جای کلمه ی public، یکی از سه کلمه ی public، private یا protected می تواند مورد استفاده قرار بگیرد. قبل از این که مفهوم وجود هر کدام را توضیح دهم، ابتدا باید با سطح دسترسی protected آشنا شوید. عضوهایی از کلاس که دارای سطح دسترسی protected هستند، از بیرون کلاس قابل دسترسی نیستند و فقط می توان به آن ها از طریق کلاس های وارث (و یا خود کلاس، بدیهتا) دسترسی پیدا کرد.

حالا بیایید به مفهوم استفاده از یکی از کلمات کلیدی public، protected و یا private بپردازیم؛

  1. اگر در قسمت نوع ارث بری از کلمه ی public استفاده کنید، کلاس وارث می تواند مانند اوقات معمولی (هنگامی که از بیرون از کلاس از کلاس استفاده می شود) از عضو های کلاس پایه استفاده کند. یعنی سطح دسترسی عضوهای کلاس پایه به همان صورتی که در خود کلاس پایه تعریف شده تلقّی می شود. 
  2. اگر نوع ارث بری، protected تعریف شود، سطح دسترسی تمامی عضوهای کلاس پایه به صورت protected در می آید مگر این که private باشد.
  3. اگر نوع ارث بری، private باشد، سطح دسترسی تمامی عضوها به private تبدیل می شود.

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

فعلا همین مقدار درس بس است، موفق باشید!