類的多個繼承

2021-06-19 17:08:55 字數 3031 閱讀 6902

先看一段**

#includeclass a

; virtual void printaa()

;};class b

};class c:public a,public b

; virtual void printb() };

void main()

看一下彙編**

.text:0040f03b                 mov     ecx, [ebp+var_28]

.text:0040f03e mov [ebp+var_18], ecx

.text:0040f041 mov edx, [ebp+var_18]

.text:0040f044 mov eax, [edx]

.text:0040f046 mov esi, esp

.text:0040f048 mov ecx, [ebp+var_18]

.text:0040f04b call dword ptr [eax]// b->printb()

.text:0040f04d cmp esi, esp

.text:0040f04f call __chkesp

.text:0040f054 mov ecx, [ebp+var_14]

.text:0040f057 mov edx, [ecx]

.text:0040f059 mov esi, esp

.text:0040f05b mov ecx, [ebp+var_14]

.text:0040f05e call dword ptr [edx] //a->printa()

.text:0040f060 cmp esi, esp

.text:0040f062 call __chkesp

.text:0040f067 mov eax, [ebp+var_14]

.text:0040f06a mov edx, [eax]

.text:0040f06c mov esi, esp

.text:0040f06e mov ecx, [ebp+var_14]

.text:0040f071 call dword ptr [edx+4] //a->printaa()

.text:0040f074 cmp esi, esp

.text:0040f076 call __chkesp

.text:0040f07b mov ecx, [ebp+var_c]

.text:0040f07e mov large fs:0, ecx

.text:0040f085 pop edi

.text:0040f086 pop esi

.text:0040f087 pop ebx

.text:0040f088 add esp, 68h

.text:0040f08b cmp ebp, esp

.text:0040f08d call __chkesp

.text:0040f092 mov esp, ebp

.text:0040f094 pop ebp

.text:0040f095 retn

.text:0040f095 _main endp

先看一下大小,如果c只有乙個基類,那它的大小就是4,上一次,說明了。而這有兩個基類,那它為什麼是8。很明顯,由於a,b都有虛函式,所以,在c是其實有兩個虛表。

看看列印,printf("a:%d b:%d c:%d\n",a,b,c);a: 5648160 b:5648164 c:5648160,而為什麼a,b不一樣。這會和虛表有關。

a *a = c;

b *b = c;

這兩句**並不是簡單的將c的值給a,b。而是編譯器內部處理了。

相當於a  = c

b = c + 4 //4 是sizeof(a)

為什麼是b是加4,class c:public a,public b.這就是原因

所以呼叫print 時,以下是,(只是簡單的解釋,不能編譯的)

call [(dword*)a[0]][0] //   a->printa();

call [(dword*)a[0]][1] //   a->printaa();

call [(dword*)b[0]][0] //   b->printb();

總結一下:

class a

pvoid *vftable_a ;

class b

pvoid *vftable_b ;

class c:public a,public b

pvoid *vftable_c_fro_a;

pvoid *vftable_c_fro_b;

}

繼承父類並實現多個介面

package cn.ly.day.seven.twentytwo 使用介面的時候,需要注意 1.介面是沒有靜態 塊或者構造方法。2.乙個類的直接父類是唯一的,但是乙個類可以同時實現多個介面。格式 public class myinte ceimpl implements myinte cea,my...

例項022多個類從乙個類繼承

module module1 public class 人員 private pname as string public property name as string getreturn pname end get set byval value as string pname name end...

python 類 繼承 python 類的繼承

1 所用的類都可以被繼承 2 沒有繼承其他類的類必然有乙個父類 object 3子類可以擁有父類的 init 裡的類容 派生子類除了父類的一些屬性,還會有自己的屬性和方法,這些就叫派生 如何使用 實現 class animal def init self,name,attack,hp self.na...