۵ مطلب با کلمه‌ی کلیدی «کلاس پایه» ثبت شده است

اشاره گر و یا مرجع از نوع کلاس پایه به کلاس وارث

سلام!

در این مبحث می خواهیم یک قابلیت بسیار کاربردی را برای کلاس ها (و وراثت) آموزش دهیم. فرض کنید کدی مانند کد زیر را نوشته اید. این کد چیز خاصّی ندارد. یک کلاس Shape هست با دو وارث با نام های Square و Circle. کلاس Shape یک string دارد به نام type که در آن نوع شکل ذخیره می شود.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class Shape{
    protected:
        string _type;
    public:
        
        Shape( string type = "Shape" ) : _type( type ) {}

        string type();

        void setType( string = "" );

        string area();

};

string Shape::type(){
    return this->_type;
}

void Shape::setType( string type ){
    this->_type = type;
}

string Shape::area(){
    return "not defined";
}

class Square : public Shape{
    protected:
        double _width;
    public:

        Square( double width = 0 ) : _width( width ) , Shape( "Square" ) {}

        double width();
        
        void setWidth( double = 0 );

        double area();
};

double Square::width(){
    return this->_width;
}

void Square::setWidth( double width ){
    this->_width = width;
}

double Square::area(){
    return pow( this->width(), 2 );
}

class Circle : public Shape{
    protected:
        double _radius;
    public:
        
        Circle( double radius = 0 ) : _radius( radius ), Shape( "Circle" ) {}

        double radius();

        void setRadius( double = 0 );

        double area();
};

double Circle::radius(){
    return this->_radius;
}

void Circle::setRadius( double radius ){
    this->_radius = radius;
}

double Circle::area(){
    return pow( this->radius(), 2) * acos( -1 );
}

int main(){
    Circle circle( 10 );
    Square square( 10 );
    Shape shape;
    cout << "I am a " << circle.type() << " and my area is " << circle.area() << endl;
    cout << "I am a " << square.type() << " and my area is " << square.area() << endl;
    cout << "I am a " << shape.type() << " and my area is " << shape.area() << endl;
    return 0;
}

حالا یک اشاره گر با نوع کلاس Shape می سازیم و آدرس آن را برابر با آدرس یک Object از Square قرار می دهیم، یعنی

Shape *shape = &square;

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

ارث بری چند گانه (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 می گویند.

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