2013-05-09 1 views

답변

2

개체 한꺼번에 생성된다 : 필드를위한 공간이 지식에 기초하여 할당되는 것을 암시 적으로, Y, XZ 선언 필드의 합 (및 object 오버 용 X : Y : Z 필요 공간 베이스는 Z). 필드는 상속되므로 X a Z입니다.

이들은 생성자가 작동하는 방식 인 이기 때문에 상향식으로 초기화됩니다.; 우리가 작성하는 경우 :

class A : B 
{ 
    private int _a = 1; 
    public A() { Console.WriteLine("A"); } 
} 
class B { 
    private int _b = 1; 
    public B() { Console.WriteLine("B"); } 
} 

을 우리는 (B에 대해) 수 :

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldc.i4.1 
    L_0002: stfld int32 B::_b 
    L_0007: ldarg.0 
    L_0008: call instance void [mscorlib]System.Object::.ctor() 
    L_000d: ldstr "B" 
    L_0012: call void [mscorlib]System.Console::WriteLine(string) 
    L_0017: ret 
} 

A을 위해 :

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
{ 
    .maxstack 8 
    L_0000: ldarg.0 
    L_0001: ldc.i4.1 
    L_0002: stfld int32 A::_a 
    L_0007: ldarg.0 
    L_0008: call instance void B::.ctor() 
    L_000d: ldstr "A" 
    L_0012: call void [mscorlib]System.Console::WriteLine(string) 
    L_0017: ret 
} 

노트는 자신을 실행 전에베이스 생성자 를 호출 로컬 생성자 코드. 필드 이니셜 라이저는 그 전에도옵니다.

3

은 몇 가지 예를 가질 수 있습니다 :

class A 
{ 
    int x; 
    int y; 
} 

class B: A 
{ 
    int c; 
} 

당신이 A의 새 인스턴스를 만들 경우, 메모리의 조각은 힙에 만드는 것입니다. 이 메모리는 8 바이트를 차지합니다. x의 경우 4 바이트이고 y의 경우 4 바이트입니다. (나는 더 많은 메모리가 그 유형 등을 위해 예약되어 있음을 알고 있지만, 나는이 범위 밖에서 그것을 남겨 둘 것이다).

B의 새 인스턴스를 만들면 메모리 조각이 만들어집니다. 두 가지가 아니라 하나뿐입니다. 그래서 아무도 아이 인스턴스 또는 무엇이든. 길이가 12 바이트 (x 4 바이트 y 4 바이트 메모리의 조각은 힙에 생성 된 새로운 분야 z.

4 바이트로 메모리 의지의이 작품은, 그것은 항상 가득합니다 제로의. 그래서 모든 fieds이 경우 0에, 기본 값을 갖게됩니다.

두 클래스 공개 매개 변수가없는 생성자를했을 경우,이 생성자가 자동으로 호출된다.

class A 
{ 
    int x; 
    int y; 
    public A() 
    { 
     x = 1; y = 2;  
    } 
} 

class B: A 
{ 
    int c; 
    public B() 
    { 
     z = 3; 
    } 
} 

B의 새로운 인스턴스 인 경우 창조하다 ated의 생성자는 B이 호출됩니다. 생성자가 수행하는 첫 번째 작업은 A의 호출 생성자입니다. Axy12으로 설정합니다. 그런 다음 프로그램은 B의 생성자로 돌아가며 누가 3 값으로 z을 초기화합니다.

B의 생성자도 같이 쓸 수 있었다

(B는 기본 A의 생성자를 호출하는 것을 보여주기 위해) :

public B() 
     : base() 
    { 
     z = 3; 
    } 
0

이에 대한 간단한 설명은 생각 상속은 복사기

그럼 2 개의 클래스를 정의 할 수 있습니다.

class Base 
{ 
} 

class Child : Base 
{ 
} 

이제 자식 개체를 만들고 싶습니다. . 하위는 자체 필드가 ​​있지만 기본에서 상속되므로 기본 클래스의 모든 필드를 복사하여 자동 작성해야합니다.

클래스는 개체의 템플릿이며, 상속은 새 템플릿을 만드는 동안 첨부 할 수있는 재구성 가능한 템플릿입니다.

+0

모든 필드를 "복사"하지 않으므로 상속됩니다. 그들은 * 동일한 필드 * –

+0

하지만 기본 클래스의 템플릿을 복사하는 단순한 행위를 상속하지 않습니다? – Anand

+0

아니요. 개인 필드를 사용할 수있게합니다. –

관련 문제