סליחה, לא הבנתי את הקוד בהודעה הראשונה שלך.
היות ו-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;
}