1. 程式人生 > 其它 >虛基類的內部工作原理

虛基類的內部工作原理

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; }

結果: