PDA

View Full Version : Casts



iut.ali
چهارشنبه 18 تیر 1393, 23:06 عصر
با سلام فرض کنید که ما دو کلاس پایین رو داریم
class A
{

}
class B:public A
{

}
حالا تفاوت بین cast های زیر چیه و اصن این نوع cast به چه دردی میخوره

B b;
A a= b;
A *a =new B();
A &a= b;

با تشکر

rahnema1
پنج شنبه 19 تیر 1393, 06:03 صبح
سلام
جهت مثال من کلاس را یه کم توسعه دادم

class A
{
public:
int xa,ya;
};
class B:public A
{
public:
int xb,yb;
};

در حالت اول از مثال شما که بهش «مقدار دهی اولیه از طریق کپی» می گن تنها زیرمجموعه ای از b به داخل a «کپی» میشه که مربوط به کلاس A باشه یعنی xa,ya

در حالت دوم ما با استفاده از حافظه پویا مقداری از حافظه به اندازه B اشغال می کنیم ( که این مقدار حافظه از میزانی که فقط توسط A اشغال میشه بیشتره، چون B کلاس A را هم در بر می گیره)
اما نکته ای که وجود داره ما به طور معمول تنها به اون قسمت حافظه دسترسی داریم که مربوط به کلا A میشه یعنی xa,ya

cout<< a->xa;

اما با روش زیر میشه به قسمتهایی از حافظه که مربوط به کلاس B میشه هم دسترسی پیدا کرد

cout<< ((B *)a)->xb;

در مورد سوم a دقیقا به زیرمجموعه ای از شیء b ارجاع میده که مربوط به کلا A میشه و اگه a تغییر کنه b هم تغییر پیدا می کنه

A &a=b;
a.xa= 13;
cout<< b.xa;

iut.ali
پنج شنبه 19 تیر 1393, 23:22 عصر
ممنون از جوابتون ولی خب این نوع cast کردن به چه دردی میخوره مثلا ما چه نیازی داریم شی کلاس A رو به اندازه ی B ، نیو کنیم

rahnema1
جمعه 20 تیر 1393, 10:53 صبح
ممنون از جوابتون ولی خب این نوع cast کردن به چه دردی میخوره مثلا ما چه نیازی داریم شی کلاس A رو به اندازه ی B ، نیو کنیم

شما اینجا با مفهوم انتزاع و چند ریختی در شیء گرایی سر و کار دارید
به عنوان یک منبع می تونید به این سایت مراجعه کنید
http://www.cplusplus.com/doc/tutorial/polymorphism
یا به این سایت جهت مطالعه انواع طراحی ها:
http://www.oodesign.com

مثلا فرض کنید می خواهیم یک برنامه بنویسیم که مشخصات تعدادی شکل را بگیره ، شکلها را ذخیره کنه و بعدا یک گزارش بگیریم و بگیم مساحت شکلها را حساب کن

#include <iostream>
#include <vector>
class Shekl{

public:
virtual void masahat() = 0;

};

class Dayere : public Shekl{
int shoa;
public:
Dayere(int _shoa):shoa(_shoa){};
void masahat() { std::cout << "masahat=" << shoa*shoa*3.14 << std::endl; }
};

class Moraba : public Shekl{
int tool;
public:
Moraba(int _tool):tool(_tool){}
void masahat() { std::cout << "masahat=" << tool*tool << std::endl; }
};

int main()
{
std::vector<Shekl *> Ashkal;//ijade list

//por kardane list:
Ashkal.push_back(new Dayere(3));
Ashkal.push_back(new Moraba(7));
Ashkal.push_back(new Moraba(2));
Ashkal.push_back(new Dayere(15));
//gozareshe masahat:
for (Shekl* s : Ashkal)
s->masahat();
}

اگه بخواهیم بعدا شکلی به نام مستطیل ایجاد کنیم و مساحت اون را حساب کنیم کافیه یک کلاس مستطیل ایجاد کنیم بدون اینکه در بدنه کد بخواهیم تغییر بدیم

این مثال را مثلا در موارد واقعی مثل دیتابیس یک دانشگاه که شامل استاد، دانشجو، کارمند و .. میشه تعمیم بدید