שאלה

geek100

New member
שאלה

שאלה ב-C++\

מחלקה A יורשת ממחלקה B

class A:

B m_b
A()

int main
B ptr = new A()

מה הסדר קריאה של הקונסטרקטורים ודיסרקטורים?
ביחוד למשתנה m_b איך הוא יאותחל ? אין קריאה ישירה לאתחול שלו בקונסטרקטור

תודה
 

BravoMan

Active member
עם הבנאי \ קונסטרקטור יש עקרון פשוט:

אובייקט האב חייב להיבנות ולעבור אתחול לפני שבונים את אובייקט הבן, כי הבן למעשה "תוספת" שמסתמכת על הפונקציונליות של האב.

לכן הבנאי של B חייב להיקרא ראשון.

אם הדסטרקטור יש בעיה:
אם במחלקה B הדסטרקטור אינו ווירטואלי, בקריאה ל-delete יקרא רק הדסטרקטור של B, ושל A לא יקרא בכלל.
(זה כמובן רק בדוגמה שלך, שבה מחזיקים מצביע לאובייקט האב)

אם לאומת זאת הוא מוגדר כווירטואלי, סדר הקריאה יהיה הפוך לזה של הבנאי: קודם דסטרקטור של A ואחרכך של B.
 

geek100

New member
מה לגבי משתנה המחלקה של A המשתנה m_B

מתי יקרא הCTOR שלו ? הרי הוא חייב להתאתחל מתישהו ...
ואין לו אתחול ב CTOR של B
 

BravoMan

Active member
סליחה, לא הבנתי את הקוד בהודעה הראשונה שלך.

היות ו-m_b הוא איבר של A, הוא חייב לעבור אתחול כש-A נבנה, והיות שהאתחול שלו הוא קריאה לבנאי ברירת מחדל של B (כי הוא אובייקט מטיפוס B) היא תתבצע אוטומטית לפני שאר הקוד של הבנאי של A.

זה כאילו הוספתה אותו לרשימת האתחול (למדת "רשימות אתחול"?).

כלומר, הבנאי של m_b יקרא אחרי הבנאי של B שמייצר את התשתית עבור אובייקט A עצמו, ולפני הבנאי של A.

אבל, במקום לסמוך על המילה שלי, תקמפל ותריץ את הקוד הקצר הזה ותראה בעצמך:

#include <iostream>

using namespace std;

class B {
public:
B(): m_num(0) { cout << "Default B C'tor" << endl; }
B(int num): m_num(num) { cout << "B C'tor #" << num << endl; }

virtual ~B() { cout << "B D'tor #" << m_num << endl; }

private:
int m_num;
};

class A: public B {
public:
A(): B(2) { cout << "A C'tor" << endl; }

B m_b;

~A() { cout << "A D'tor" << endl; }
};

int main(int argc, char **argv) {
B *b = new A();

delete b;

return 0;
}
 
למעלה