#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
// 今日遇到一個多重繼承的問題,是一個同事寫的代碼,是一些業務上的邏輯,我把問題該寫爲如下代碼:
class IGameRuleBase
{
public:
IGameRuleBase(){}
virtual~IGameRuleBase(){}
virtual int Init( ) = 0;
};
class IGameBase
{
public:
IGameBase(){}
virtual~IGameBase(){}
virtual int Doing( ) = 0;
};
class Game : public IGameRuleBase,
public IGameBase
{
public:
Game( ){ }
virtual ~Game( ){ }
virtual int Init( ) {return 0;}
virtual int Doing( ){return 1;}
};
void ExeGame( IGameBase * pGameRule )
{
pGameRule->Doing( );
}
int main()
{
IGameRuleBase * GameRuleBase = new Game( );
ExeGame( (IGameBase*)pGame );
return 0;
}
// 在邏輯運行的過程中,單運行到ExeGame函數的pGameRule->Doing( )是否就出現錯誤,
// 原來問題是對象類型的轉換和對象模型的問題,Game是從IGameRuleBase和IGameBase
// 繼承下來,讓IGameRuleBase保存new出來的Game,然後指針轉換到IGameBase指針,導致類的虛表的信息還是原來的
// 沒有隨着轉換而改變,出現這種問題在於寫代碼不嚴謹所致,今日幫同事解決了這個問題
// 回來自己記下來,好讓自己有個警惕,儘可能的少使用多重繼承.