파생 클래스의 인스턴스를 만들 때 기본 클래스가 파생 클래스보다 먼저 자동으로 인스턴스화되는 방법을 알고 싶습니다.파생 클래스 전에 기본 클래스가 자동으로 인스턴스화되는 방법
기본 클래스의 멤버가 메모리를 차지하고 하위 클래스의 참조가 어떻게 액세스했는지 알고 싶습니다.
파생 클래스의 인스턴스를 만들 때 기본 클래스가 파생 클래스보다 먼저 자동으로 인스턴스화되는 방법을 알고 싶습니다.파생 클래스 전에 기본 클래스가 자동으로 인스턴스화되는 방법
기본 클래스의 멤버가 메모리를 차지하고 하위 클래스의 참조가 어떻게 액세스했는지 알고 싶습니다.
개체 한꺼번에 생성된다 : 필드를위한 공간이 지식에 기초하여 할당되는 것을 암시 적으로, Y
, X
에 Z
선언 필드의 합 (및 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
}
노트는 자신을 실행 전에베이스 생성자 를 호출 로컬 생성자 코드. 필드 이니셜 라이저는 그 전에도옵니다.
은 몇 가지 예를 가질 수 있습니다 :
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
의 호출 생성자입니다. A
은 x
및 y
을 1
및 2
으로 설정합니다. 그런 다음 프로그램은 B
의 생성자로 돌아가며 누가 3
값으로 z
을 초기화합니다.
B
의 생성자도 같이 쓸 수 있었다
(B
는 기본 A
의 생성자를 호출하는 것을 보여주기 위해) :
public B()
: base()
{
z = 3;
}
이에 대한 간단한 설명은 생각 상속은 복사기
로그럼 2 개의 클래스를 정의 할 수 있습니다.
class Base
{
}
class Child : Base
{
}
이제 자식 개체를 만들고 싶습니다. . 하위는 자체 필드가 있지만 기본에서 상속되므로 기본 클래스의 모든 필드를 복사하여 자동 작성해야합니다.
클래스는 개체의 템플릿이며, 상속은 새 템플릿을 만드는 동안 첨부 할 수있는 재구성 가능한 템플릿입니다.
모든 필드를 "복사"하지 않으므로 상속됩니다. 그들은 * 동일한 필드 * –
하지만 기본 클래스의 템플릿을 복사하는 단순한 행위를 상속하지 않습니다? – Anand
아니요. 개인 필드를 사용할 수있게합니다. –