נניח שנתונות מחלקה X ומחלקה Y שיורשת מ-X,

נניח שנתונות מחלקה X ומחלקה Y שיורשת מ-X,

וכן נתונה תבנית מחלקה <A<T.

מדוע במקרה זה לא ניתן להצבע השמה ה ממשתנה מטיפוס <A<Y למשתנה מטיפוס <A<X ?
 

BravoMan

Active member
כי אלה שתי מחלקות שונות שאינן קשורות אחת לשניה.

תבנית של מחלקה מאפשרת לך לייצר מחלקות שונות שאין קשרי ירושה בניהן.
אין לך דרך לדעת (בלי לקרוא את הקוד) איך המחלקה A תשתמש ב-X או ב-Y.
&nbsp
יכול להיות שפשוט יהיה לה משתנה פנימי private מהסוג הזה, או שתהיה לה פונקציה שמקבלת X או Y כפרמטר.
 

BravoMan

Active member
באיזה נושא?

אמור להיות פרק על templates בכל ספר לימוד של ++C.
איך אתה לומד את השפה?
&nbsp
אולי בעצם ה-keyword שחסר לך זה "Template"?
כי <A<T זו לא מחלקה.
זו "תבנית" - קוד חלקי מוכן, שמאפשר לך לייצר מחלקות שונות ומשונות שיש בניהן חלקים משותפים.
יש גם תבניות לפונקציות בודדות.
 
הנושא הוא covariance

בשפת c++, אכן אין כמעט קשר (עדיין, יש תבניות של הספריה הסטנדרטית שמאפשרות דברים דומים), אך בשפות אחרות (כגון java), אפשר לכתוב תבנית שיוצרת ירושה "אוטומטית" כזו.
 

selalerer

New member
ב-++C? אתה יכול להוסיף לוגיקה כזו בעצמך

ב-++C הקומפיילר יוצר לך עבור <A<X ועבור <A<Y שתי מחלקות שונות. כל המשותף בינהן מבחינת התוצאה הוא שהקוד שלהן דומה.

אתה יכול לכתוב אופרטור = שמוכן לקבל A עם template parameter אחר:
קוד:
template<typename T>
class A
{
private:
  T member;
public:
  T getMember() { return member; }

  template<typename OTHER_T>
  void operator=(const A<OTHER_T>& other)
  {
    this->member = (T)other.getMember();
  }
};
ה-++C שלי קצת חלודה, אז יכול להיות שכתבתי קצת שטויות אבל זה צריך להיות משהו באיזור הזה
 
למעלה