C++:類
阿新 • • 發佈:2020-09-04
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