多重繼承的識別

2021-07-22 17:51:02 字數 2411 閱讀 7055

在多重繼承中,子類虛表指標的個數取決於所繼承父類的個數,有幾個父類就會有幾個虛表指標(虛基類除外)。這些指標在將子類物件轉換成父類指標時使用,每個虛表指標對應乙個父類。

class csofabed :  public csofa,  public cbed{

public:

csofabed(){

00407838 89 4d f0 mov dword ptr [this],ecx

0040783b 8b 4d f0 mov ecx,dword ptr [this]

0040783e e8 3c c8 ff ff call csofa::csofa (040407fh) ;呼叫第乙個父類的建構函式

00407843 c7 45 fc 00 00 00 00 mov dword ptr [ebp-4],0

0040784a 8b 4d f0 mov ecx,dword ptr [this]

0040784d 83 c1 08 add ecx,8 ;將this指標調整到第二個虛函式位址處 這個8是第乙個父類的長度

00407850 e8 5c c8 ff ff call cbed::cbed (04040b1h) ;呼叫第二個父類的建構函式

00407855 8b 45 f0 mov eax,dword ptr [this]

;設定虛表指標

00407858 c7 00 f4 90 49 00 mov dword ptr [eax],offset csofabed::`vftable' (04990f4h)

0040785e 8b 45 f0 mov eax,dword ptr [this]

;設定虛表指標

00407861 c7 40 08 34 92 49 00 mov dword ptr [eax+8],offset csofabed::`vftable' (0499234h)

子類物件轉換為父類指標的特徵

csofabed sofabed;

00407bd9 8d4

d e8 lea ecx,[sofabed]

00407bdc e8 a8 c4 ff ff call csofabed::csofabed (0404089h)

csofa *psofa = &sofabed;

00407be1 8

d45 e8 lea eax,[sofabed]

00407be4 89

45 e4 mov dword ptr [psofa],eax ;第乙個父類的指標在首位址處

cbed *pbed = &sofabed;

00407be7 8

d45 e8 lea eax,[sofabed]

00407bea 85 c0 test eax,eax ;檢查一下 防止意外

00407bec 74

0b je main+29h (0407bf9h) ;這裡的je和下面的jmp是個不錯的特徵

00407bee 8d4

d e8 lea ecx,[sofabed]

00407bf1 83 c1 08 add ecx,8 ;調整得到第二個父類的指標

00407bf4 894d

9c mov dword ptr [ebp-64h],ecx

00407bf7 eb 07 jmp main+30h (0407c00h)

00407bf9 c7 459c

0000

0000 mov dword ptr [ebp-64h],0

00407c00 8b 55

9c mov edx,dword ptr [ebp-64h]

00407c03 89

55 e0 mov dword ptr [pbed],edx

多重繼承 C 中的多重繼承

多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...

多重繼承 Python的封裝繼承多型和多重繼承

相信你一定知道繼承,多型和封裝。封裝通常是為了提供統一介面而將具體實現過程或者屬性以方法或者類的方式對外呈現 繼承就是子類繼承父類從而擁有父類的方法和屬性 多型是繼承了同乙個父類的不同子類分別重寫了父類的某個方法而使得這個方法在不同的子類中有不同的實現。多重繼承即子類繼承多個父類,擁有多個父類的方法...

多重繼承(菱形繼承)

多重繼承 經典的是菱形繼承,如圖。菱形繼承將會產生的問題 把基類a中的成員變數通過b和c兩次繼承至d。d的繼承結構 可以看到,ma被繼承兩次至d 那麼將如何解決這個問題呢?採用虛繼承的方法,將基類a中的ma直接繼承至d。如下 class a int ma class b virtual public...