虛基類的內部工作原理
阿新 • • 發佈:2021-08-23
1。對照表來看
程式碼:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Animal { public: int m_Age; }; //虛基類 Sheep class Sheep:virtual public Animal { }; //虛基類 Tuo class Tuo: virtual public Animal {}; class SheepTuo :public Sheep, public Tuo { }; void test01() { SheepTuo st; st.Sheep::m_Age= 10; st.Tuo::m_Age = 20; cout << st.Sheep::m_Age << endl; //20 因為指向的時同一個地址 cout << st.Tuo::m_Age << endl; //20 cout << st.m_Age << endl; //20 可以直接訪問m_Age資料 原因時因為沒有二義性了 } //通過地址 找到偏移量 //內部工作原理 void test02() { SheepTuo st; st.m_Age = 100; //找Sheep的偏移量操作// &st 對照類的模型表來看 先取到地址 //(int *)&st //轉成int* 是為了改變步長 // *(int *)&st //取* 找到虛基類表 // (int *) * (int *)&st //去到虛基類表的步長 // (int *) * (int *)&st + 1 //取到虛基類表的步長 + 1 獲取到Sheep陣列的第1位 // (int *)((int *) * (int *)&st + 1) //取到步長後再加int * 此時地址指向偏移量所在的位置 // *(int *)((int *) * (int *)&st + 1)//取到資料所在的位置 前面加* 獲取到值 如圖所以 Sheep的陣列為 0:0, 1:8 cout << *(int*)((int*)*(int*)&st + 1) << endl; //獲取到Sheep的偏移量為 8 //找Tuo的偏移量 //(int *)&st + 1; //先取到地址 改變步長後 找Tuo虛基類表的位置為 改變步長後+1 找到Tuo的虛基類表的地址 // *((int *)&st + 1) //根據Tuo的虛基類表的地址取* 找到Tuo的虛基類表 // (int*)*((int *)&st + 1) //根據Tuo虛繼類表取步長 獲取陣列的地址 // *((int*)*((int *)&st + 1)+1) //根據陣列的地址 取第1位的地址 取* 獲得偏移量 cout << *((int*)*((int*)&st + 1) + 1) << endl; //獲取Tuo的便宜量為 4 cout << *((int*)((int*)*((int*)&st + 1) + 1)) << endl; //教程為這個 答案也是4 } int main() { test02(); //test01(); system("Pause"); return 0; }
結果: