اگر کلاس ويژگی های تنها يک کلاس را به ارث ببرد وارثت منفرد(single inheritance) و اگر از چند کلاس به ارث گرفته شود وارثت چندگانه (multiple inheritance) ناميده می شود.
ارث از کلاس پایه ممکن است به صورت عمومی، خصوصی یا محافظت شده باشد. این مشخصه های دسترسی تعیین می کنند کلاس های مشتق شده می توانند به اعضای عمومی و محافظت شده کلاس پایه دسترسی پیدا کنند یا خیر. تنها وراثت عمومی است که با مفهوم توارث تطبیق دارد. دو فرم دیگر کمتر استفاده می شوند.
ارث از کلاس پایه ممکن است به صورت عمومی، خصوصی یا محافظت شده باشد. این مشخصه های دسترسی تعیین می کنند کلاس های مشتق شده می توانند به اعضای عمومی و محافظت شده کلاس پایه دسترسی پیدا کنند یا خیر. تنها وراثت عمومی است که با مفهوم توارث تطبیق دارد. دو فرم دیگر کمتر استفاده می شوند.
#include <iostream>
using namespace std;
// Base class
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout « "Total area: " « Rect.getArea() « endl;
return 0;
}
using namespace std;
// Base class
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout « "Total area: " « Rect.getArea() « endl;
return 0;
}
کد بالا مثالی از ارث بری یه کلاس از کلاس پایه هست به کلاسی که از آن ارث برده شده همان کلاس shape کلاس والد یا پایه و به کلاسی که از کلاس پایه یا والد ارث ببرد همان کلاس rectangle کلاس فرزند یا مشتق شده می گویند.
در کد بالا یه کلاس با نام shape تعریف شده و متد هایی با دسترسی های مختلف تعریف شده است و اگر به کلاس rectangle توجه کنید می بینید که با ارث بردن از کلاس shape در متدی که با نام getarea تعریف کرده است به width , height که در کلاس پایه تعریف شده دسترسی پیدا کند و در قسمت main می بینید که با ساختن شی از کلاس rectangle توانسته به متدهای setwidth , setheight از کلاس shape دسترسی پیدا کرده و آن ها رو مقدار دهی کند.
چندريختی در C++ توسط توابع مجازی پياده سازی می شود. تابع مجازی تابع عضوی است که انتظار می رود در کلاس های مشتق شده دوباره تعريف شود. درک چندريختی بدون استفاده از توارث و انتزاع غيرممکن است.
چندريختی (polymorphism) يکی از ويژگی های زبان های شیءگراست. به واسطه چندريختی توابع می توانند به شيوه های مختلف پياده سازی شوند ولی از طريق يک اسم يکسان در دسترس قرار بگيرند.
چندريختی در ++C به دو شکل پشتيبانی می شود؛ در زمان کامپايل و در زمان اجرا. سربارگذاری توابع و عملگرها نمونه هائی از چندريختی در زمان کامپايل هستند. چندريختی در زمان اجرا با تلفيق وراثت و توابع مجازی حاصل می شود.
چندريختی در ++C به دو شکل پشتيبانی می شود؛ در زمان کامپايل و در زمان اجرا. سربارگذاری توابع و عملگرها نمونه هائی از چندريختی در زمان کامپايل هستند. چندريختی در زمان اجرا با تلفيق وراثت و توابع مجازی حاصل می شود.
#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:
int area ()
{
cout « "Rectangle class area :" «endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
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;
}
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:
int area ()
{
cout « "Rectangle class area :" «endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
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;
}
در کد بالا طبق توضیح قبل در مبحث ارث بری می بینید که کلاس triangle از کلاس shape ارث برده و متدهایی که در کلاس shape تعریف شده در کلاس triangle فراخوانی شده اگه به کلاس shape دقت کنید می بینید یک متد به نام area تعریف شده و داخل این متد یه رشته چاپ می شه همچنین اگر به کلاس triangle توجه کنید می بنید بعد ارث بری کلاس triangle متد area رو فراخوانده است ولی دستورات داخلی این متد تغییر کرده است و ضریب width , height رو بر می گرداند به این فرآیند چند ریختی می گویند.
در حقیقت متد همان متدی است که در کلاس پایه تعریف شده ولی دستوراتی که داخل متد هست تغییر پیدا کرده
ساختمان مجموعه ای از عناصر است که میتوانند همنوع نباشند. کلاس نیز به همین صورت تعریف شده است. شیوه تعریف ساختمان نیز با کلاس یکسان است. به این ترتیب ارتباط خیلی نزدیکی با یکدیگر دارند.در واقع، ساختمان از زبان C به C++ به ارث رسیده است. تنها تفاوت کلاس و ساختمان در C++ این است که اعضای کلاس در حالت عادی بصورت اختصاصی اند ولی اعضای ساختمان بصورت عمومی اند. در سایر موارد دقیقا یکسان هستند. برای تعریف نوع ساختمان از کلمه کلیدی struct استفاده میشود. این دستور بصورت زیر بکار می رود:
Struct نام نوع ساختمان
{
publc:
عناصر عمومی ساختمان
Private:
عناصر اختصاصی ساختمان
};
{
publc:
عناصر عمومی ساختمان
Private:
عناصر اختصاصی ساختمان
};
اعضای عمومی و اختصاصی ساختمان، همچون کلاس میتوانند بصورت داده ای یا تابعی باشند. عناصری که بلافاصله پس از سطر مربوط به کلمه کلیدی struct ظاهر میشوند، اعضای عمومی اند. اعضایی که در بخش private می آیند، اعضای اختصاصی ساختمان میباسند.
به هرحال، ساختمانها در C++ میتوانند کاربرد کلاسها را داشته باشند. به عبارت دیگر، ساختمانها نیز مانند کلاسها میتوانند برای تعریف اشیا به کار گرفته شوند.
به هرحال، ساختمانها در C++ میتوانند کاربرد کلاسها را داشته باشند. به عبارت دیگر، ساختمانها نیز مانند کلاسها میتوانند برای تعریف اشیا به کار گرفته شوند.
در کد بالا تعریف ساختار رو می بینم ولی اگر بخواییم از این ساختاری که ایجاد می کنیم استفاده کنیم به کدر زیر دقت کنید
#include <iostream>
using namespace std;
struct pointform
{
int top;
int bottom;
int left;
int right;
};
int main() {
pointform sa = { 0, 0, 0, 0};
cout « sa.bottom « endl;
cout « sa.left « endl;
cout « sa.right « endl;
cout « sa.left « endl;
return 0;
}
using namespace std;
struct pointform
{
int top;
int bottom;
int left;
int right;
};
int main() {
pointform sa = { 0, 0, 0, 0};
cout « sa.bottom « endl;
cout « sa.left « endl;
cout « sa.right « endl;
cout « sa.left « endl;
return 0;
}