class Base{ tstring type;}class A : public Base{}class B: public Base{}A* pA = new A();B* pB = new B();pA->type = "A";pB->type = "B";Base* pABase = (Base*)pA;Base* pBBase = (Base*)pB;Insert(pABase);Insert(pBBase);//獲取Base* pBase = GetFirst();switch(pBase->type){ case "A": pA = (A*)pBase; break; case "B": pB = (B*)pBase; break;}
先來回答問題。
C++的指標是非常靈活的,強制轉換成相同的類,就可以加入到連結串列了。
A* pA = null;B* pB = (B*)pA;Insert(pB);說到這裡你肯定有疑惑,強制轉換後讀取是如何轉換回來呢?這就涉及到設計層面的問題了。
既然是做查詢排序,那麼這些不同的類一定是有共性的,所以在設計上,需要將這些不同的類都設定繼承自一個共同的基類,基類中定義型別。在儲存連結串列之前設定好型別名,然後強制轉換為基類指標儲存到連結串列,讀取連結串列時先判斷型別,再進行響應的強制轉換。
class Base{ tstring type;}class A : public Base{}class B: public Base{}A* pA = new A();B* pB = new B();pA->type = "A";pB->type = "B";Base* pABase = (Base*)pA;Base* pBBase = (Base*)pB;Insert(pABase);Insert(pBBase);//獲取Base* pBase = GetFirst();switch(pBase->type){ case "A": pA = (A*)pBase; break; case "B": pB = (B*)pBase; break;}再說點題外話。上面的方法是比較直觀的,但不是一個好的設計。由於強制轉換的存在,導致每增加一個型別,就需要在讀取連結串列做一次強制轉換。很多軟體系統中的基類基於穩定和安全考慮對外是隻讀的,不允許修改。是到了虛函數出場的時候了:比如A類的排序關鍵變數為Index,B類的排序關鍵變數為Order,將獲取關鍵變數抽象為一個虛擬函式寫在基類中,A類與B類分別繼承基類並實現獲取關鍵變數的方法,基類排序中會呼叫獲取關鍵變數的方法,直接呼叫即可,不需要再做switch...case的強制轉換。這部分程式碼較多,不方便打出,有興趣可以自己嘗試。