1. 程式人生 > 實用技巧 >C++:類

C++:類

C++:類

1. 空類為什麼是一個位元組

C++編譯器不允許物件為零長度。試想一個長度為0的物件在記憶體中怎麼存放?怎麼獲取它的地址?為了避免這種情況,C++強制給這種類插入一個預設成員,長度為1。如果有自定義的變數,變數將取代這個預設成員。

2. 類中的位元組對齊

和結構體類似, 類中存在位元組對齊, 需要注意如果存在虛擬函式, 虛擬函式表佔據4個位元組。

#include <iostream>

using namespace std;

class A { // vfptr:4位元組
public:
    virtual void vfunc1()
    {
        cout 
<< "A::vfun1" << endl; } virtual void vfunc2() { cout << "A::vfun2" << endl; } void func1(); void func2(); private: int m_data1, m_data2; // 8位元組 }; class B : public A { // 虛擬函式表:4位元組 public: virtual void vfunc1(); void func1(); private
: int m_data3; // 4位元組 + 從父類繼承的8位元組 }; class C: public B { // 虛表:4位元組 public: virtual void vfunc2(); void func2(); private: int m_data1, m_data4; // 8位元組 + 從父類繼承的12位元組 }; class D {}; class F { public: virtual void fun(); bool b; // 由於存在虛表, 位元組對齊, 8個位元組 }; int main() { cout << sizeof
(A) << endl; // 12 cout << sizeof(B) << endl; // 16 cout << sizeof(C) << endl; // 24 cout << sizeof(D) << endl; // 1 cout << sizeof(F) << endl; // 8 system("pause"); return 0; }

指定位元組對齊

#pragma pack(4); // 指定4位元組對齊

3. 類中的虛擬函式表

虛擬函式表是一個函式指標型別的陣列, 類中的第一個成員是虛擬函式表首元素的地址:vfptr。

typedef void (*pFunc)(void);
A a;
int *p = (int *)&a; // 獲取物件的地址
int *fun = (int *)(*p); // 獲取虛表的地址
((pFunc)(fun[0]))(); // 獲取虛表中的表項--偏移

4. 類中的繼承

總結——公有、私有、保護繼承:
特徵 公有繼承 保護繼承 私有繼承
公有成員 派生類的公有成員 派生類的保護成員 派生類的私有成員
保護成員 派生類的保護成員 派生類的保護成員 派生類的私有成員
私有成員 只能通過基類的介面訪問 只能通過基類的介面訪問 只能通過基類的介面訪問
是否隱式向上轉換 是(只能在派生類中) 否(必須顯式)

5. 類的虛繼承

https://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html

https://www.cnblogs.com/yanqi0124/p/3829964.html