PDA

View Full Version : مبتدی: توضیح این چند خط



raminlich
سه شنبه 25 آذر 1393, 14:18 عصر
سلام به همگی
اگه میشه یه توضیح کلی بدین ممنون می شم
#include <iostream>
using namespace std;

class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << "Triangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);

// store the address of Rectangle
shape = &rec;
// call rectangle area.
shape->area();

// store the address of Triangle
shape = &tri;
// call triangle area.
shape->area();

return 0;
}
راستش این کد خروجیش اشتباهه ولی باز اضافه کردن virtual به تابع area() در خط 13 درست میشه
می خواستم دلیل این رو بدونم و در کل ویژگی virtual چیست
و یک چیز دیگه خط 8 هم درست متوجه نمیشم چی کار کرده و چرا!
ممنون

rahnema1
سه شنبه 25 آذر 1393, 18:58 عصر
سلام
خروجی اشتباه نیست . خب خاصیت virtual همینه که باعث میشه تابع مربوط به آبجکت صدا زده بشه نه تابع مربوط به اشاره گر
در اینجا shape اشاره گره و دو تا آبجکت داریم به نام rec و tri
در خط 8 هم آرگومانهای پیش فرض داریم به این معنی که اگر سازنده Shape بدون آرگومان صدا زده شده باز هم مقدار width و height برابر صفر خواهد شد به این صورت
Shape sh;

zero_ox
سه شنبه 25 آذر 1393, 21:00 عصر
آقای rahnema1 درست می گن خروجی اشتباه نیست حتی اگر virtual نباشه :
Shape *shape;
این خط اشاره گر کلاس پایه به آدرس شی مشتق است بنابراین فقط به توابع کلاس پایه shap دسترسی داره اگربرنامه رو اجرا کنید تابع area کلاس shap اجرا می شه ..و دستور return 0 صفر رو برمی گردونه اما .وقتی خط 13 رو ویژوال تعریف می کنید اونوقت به اشیائ کلاس مشتق دسترسی دارید اگر خط 47و52 رو ازدستور cout استفاده کنید متوچه می شی