سلام!

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

فرض کنید در کلاس پایه ی خود یک تابع به نام 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();
}

این نکته که بدیهی بود، حالا می خواهیم این تابع را تغییر دهیم. برای این کار کافی است یک تابع با همان Prototype در کلاس وارث تعریف کنیم. به مثال زیر توجّه کنید.

#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 ) {}
        
        void identify();
        
};

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

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

حالا می خواهیم طرز کار یک تابع را در کلاس پایه تغییر دهیم. برای این کار یک تابع در کلاس وارث با همان Prototype می نویسیم. حالا به جای این که کلّا از ابتدا تابع را بنویسیم، از خود تابع کلاس پایه در این تابع استفاده می کنیم و علاوه بر آن، امکانات جدیدی نیز به تابع اضافه می کنیم. به مثال زیر نگاه کنید.

#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 ) {}
        
        void identify();
        
};

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

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

حالا می خواهیم سطح دسترسی به عضوهای کلاس را تغییر دهیم. این کار بسیار ساده است. به مثال زیر دقّت کنید.

#include <iostream>

using namespace std;

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

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

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

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

طرز تغییر سطح دسترسی به متغیرهای کلاس پایه نیز به همین صورت است. یعنی مثل کد زیر.

#include <iostream>

using namespace std;

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

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

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

};

int main(){
    Derived derived;
    derived.identify();
    cout << derived.foo << endl;
    return 0;
}

فعلا موضوع دیگری در این رابطه باقی نمانده است.

موفق باشید!