وراثت
وراثت در سیپلاسپلاس یکی از اصول بنیادین برنامهنویسی شیءگرا است که امکان اشتراکگذاری ویژگیها و رفتارها بین کلاسها را فراهم میکند. با استفاده از وراثت، میتوانیم کلاسهای پایهای بسازیم که شامل خصوصیات و متدهای مشترک باشند و سپس کلاسهای مشتق شدهای ایجاد کنیم که این ویژگیها را به ارث ببرند و در صورت نیاز آنها را گسترش دهند یا بازنویسی کنند. این ساختار باعث کاهش تکرار کد، افزایش قابلیت نگهداری و ایجاد سلسلهمراتب منطقی در طراحی نرمافزار میشود. برای مثال، اگر کلاس پایهای با نام "وسایلنقلیه" داشته باشیم، کلاسهای مشتق شده مانند "ماشین" و "موتور" میتوانند ویژگیهای مشترک مانند نام برند و سال ساخت را به ارث ببرند و ویژگیهای خاص خود را اضافه کنند.
وراثت زمانی مفید است که چندین کلاس ویژگیهای مشابهی داشته باشند یا بخواهیم یک رابط استاندارد برای تعامل با انواع مختلف اشیا فراهم کنیم. سیپلاسپلاس انواع وراثت از جمله public، protected و private را ارائه میدهد که سطح دسترسی اعضای کلاس پایه در کلاس مشتق شده را مشخص میکند. در این آموزش، شما خواهید آموخت چگونه کلاسهای پایه و مشتق شده ایجاد کنید، از سازندهها و مخربها استفاده کنید، توابع مجازی و پولیمورفیسم را پیادهسازی کنید و وراثت را در پروژههای واقعی برای ایجاد معماریهای قابل گسترش و بهینه در سیپلاسپلاس به کار ببرید.
مثال پایه
text\#include <iostream>
\#include <string>
class VasayelNaqliye {
protected:
std::string brand;
int year;
public:
VasayelNaqliye(const std::string& b, int y) : brand(b), year(y) {}
virtual void show() const {
std::cout << "Brand: " << brand << ", Year: " << year << std::endl;
}
virtual \~VasayelNaqliye() {}
};
class Mashin : public VasayelNaqliye {
private:
int doors;
public:
Mashin(const std::string& b, int y, int d) : VasayelNaqliye(b, y), doors(d) {}
void show() const override {
std::cout << "Brand: " << brand << ", Year: " << year << ", Doors: " << doors << std::endl;
}
};
int main() {
VasayelNaqliye v("Generic", 2020);
Mashin m("Toyota", 2023, 4);
v.show();
m.show();
VasayelNaqliye* ptr = &m;
ptr->show(); // Demonstrating polymorphism
return 0;
}
در این مثال، کلاس VasayelNaqliye کلاس پایه است که شامل اعضای protected برند و سال و یک تابع مجازی show میباشد. کلاس Mashin از VasayelNaqliye به صورت public ارثبری میکند و در سازنده خود از لیست مقداردهی اولیه استفاده میکند. تابع show در Mashin بازنویسی شده است تا اطلاعات مخصوص ماشین را نمایش دهد. زمانی که یک اشارهگر از نوع کلاس پایه به کلاس مشتق شده ارجاع داده میشود، اجرای تابع show نسخه مشتق شده را فراخوانی میکند که نمونهای از پولیمورفیسم است. استفاده از مخرب مجازی باعث میشود منابع به درستی آزاد شوند و از نشت حافظه جلوگیری شود. این مثال نحوه پیادهسازی وراثت، کنترل دسترسی، سازندهها و توابع مجازی را با رعایت بهترین شیوهها در سیپلاسپلاس نشان میدهد.
مثال کاربردی
text\#include <iostream>
\#include <vector>
\#include <memory>
class Karmand {
protected:
std::string name;
double salary;
public:
Karmand(const std::string& n, double s) : name(n), salary(s) {}
virtual void show() const {
std::cout << "Employee: " << name << ", Salary: " << salary << std::endl;
}
virtual double calculateBonus() const = 0; // Pure virtual function
virtual \~Karmand() {}
};
class Modir : public Karmand {
private:
int teamSize;
public:
Modir(const std::string& n, double s, int t) : Karmand(n, s), teamSize(t) {}
void show() const override {
std::cout << "Manager: " << name << ", Salary: " << salary << ", Team: " << teamSize << std::endl;
}
double calculateBonus() const override {
return salary * 0.1 + teamSize * 100;
}
};
class Barnameriz : public Karmand {
private:
std::string language;
public:
Barnameriz(const std::string& n, double s, const std::string& l) : Karmand(n, s), language(l) {}
void show() const override {
std::cout << "Developer: " << name << ", Salary: " << salary << ", Language: " << language << std::endl;
}
double calculateBonus() const override {
return salary * 0.15;
}
};
int main() {
std::vector\<std::unique_ptr<Karmand>> team;
team.push_back(std::make_unique<Modir>("Alice", 90000, 5));
team.push_back(std::make_unique<Barnameriz>("Bob", 80000, "C++"));
for (const auto& k : team) {
k->show();
std::cout << "Bonus: $" << k->calculateBonus() << std::endl;
}
return 0;
}
در این مثال، کلاس Karmand یک کلاس انتزاعی با تابع خالص calculateBonus است. کلاسهای Modir و Barnameriz از Karmand ارثبری کرده و توابع show و calculateBonus را بازنویسی میکنند. استفاده از std::unique_ptr مدیریت امن حافظه را تضمین میکند و std::vector ذخیرهسازی انواع مختلف اشیا را امکانپذیر میسازد. فراخوانی توابع مجازی به صورت پویا نشاندهنده پولیمورفیسم است. این مثال وراثت، انتزاع و ویژگیهای مدرن سیپلاسپلاس را برای ایجاد معماریهای مقیاسپذیر و ایمن در پروژههای واقعی نشان میدهد.
بهترین شیوهها شامل استفاده از مخربهای مجازی برای آزادسازی منابع، وراثت عمومی برای روابط "is-a"، استفاده از لیست مقداردهی اولیه سازندهها و جلوگیری از object slicing است. بهتر است عمق سلسلهمراتب را کم نگه داشته و در مواقع لازم از ترکیب استفاده شود. برای بهینهسازی، از کانتینرها و الگوریتمهای STL بهره ببرید. برای دیباگینگ، ابزارهایی مانند Valgrind به شناسایی نشت حافظه کمک میکنند. امنیت با استفاده صحیح از اعضای protected/private و اجتناب از اشارهگرهای dangling تضمین میشود.
📊 جدول مرجع
سیپلاسپلاس Element/Concept | Description | Usage Example |
---|---|---|
کلاس پایه | کلاسی که به ارث داده میشود | class VasayelNaqliye { /* members */ }; |
کلاس مشتق | کلاسی که از پایه ارث میبرد | class Mashin : public VasayelNaqliye { /* members */ }; |
تابع مجازی | قابل بازنویسی در مشتق | virtual void show() const; |
تابع خالص مجازی | اجباری در مشتق | virtual double calculateBonus() const = 0; |
پولیمورفیسم | فراخوانی صحیح در زمان اجرا | VasayelNaqliye* ptr = \&m; ptr->show(); |
لیست مقداردهی اولیه | مقداردهی به اعضا بهینه | Mashin(const std::string& b,int y,int d): VasayelNaqliye(b,y), doors(d) {} |
وراثت در سیپلاسپلاس به شما امکان مدلسازی روابط بین اشیا، بازاستفاده از کد و پیادهسازی پولیمورفیسم را میدهد. با تسلط بر وراثت، میتوان سیستمهای قابل نگهداری و توسعهپذیر ایجاد کرد، سلسلهمراتب کلاسها را مدیریت کرد و اصول پیشرفته OOP را به کار گرفت. گامهای بعدی شامل مطالعه وراثت چندگانه، کلاسهای انتزاعی و الگوهای طراحی مانند Factory و Strategy است. تمرین با STL و اشیاء پولیمورفیک مهارتهای برنامهنویسی پیشرفته در سیپلاسپلاس را تقویت میکند.
🧠 دانش خود را بیازمایید
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود