class Base {
public:
Base(const std::string& s) : name(s) { std::cout << "Base: " << name << '\n'; }
private:
std::string name;
};
class Member {
public:
Member(int v) : val(v) { std::cout << "Member: " << val << '\n'; }
private:
int val;
};
class Derived : public Base {
public:
// 正確順序:基類 → 成員(依宣告順序) → 派生類本體
Derived(const std::string& b, int m, int d)
: Base(b), m_member(m), m_derived(d) { // 初始化列表順序不影響實際執行順序
std::cout << "Derived: " << m_derived << '\n';
}
private:
Member m_member; // 宣告順序 1
int m_derived; // 宣告順序 2
};
int main() {
Derived d("base", 42, 100);
// 輸出順序固定:
// Base: base
// Member: 42
// Derived: 100
}
鐵律:
struct A {
char c1; // offset 0, size 1
char c2; // offset 1, size 1
int n; // offset 4 (4-byte align), size 4
}; // sizeof(A) = 8 (尾部填充對齊到 max align = 4)
class ClassA {
public:
int m_data1; // offset 4 (vptr 佔 8/4 位元組)
int m_data2;
void func1() {}
void func2() {}
virtual void vfunc1() {} // 引入 vptr
virtual void vfunc2() {}
};
// 64 位:vptr(8) + data1(4) + data2(4) = 16,對齊 8 → sizeof = 24
// 32 位:vptr(4) + data1(4) + data2(4) = 12,對齊 4 → sizeof = 12
struct ClassB { void f(); }; // 空類別
// sizeof(ClassB) = 1 (C++ 標準保證非零大小,確保不同物件有不同位址)
class Base { int x; };
class Derived1 : virtual public Base { int y; };
class Derived2 : virtual public Base { int z; };
class Final : public Derived1, public Derived2 { int w; };
// Final 佈局包含:
// vbptr (指向虛基類表) × 2
// Derived1::y, Derived2::z, Final::w
// Base::x (共享單一拷貝,透過 vbptr 間接存取)
// 大小顯著增加,存取虛基類成員額外間接層級