class A
{
public void MethodA()
{
...
}
}
class B : A
{
public void MethodB()
{
...
}
}
.
.
.
.
.
.
A a = new B();
a.MethodA();
a.MethodB(); // error
그냥 표면적으로는 알겠는데
어떻게 구현이 가능한지 모르겠음
어떻게 부모 클래스 타입으로 선언한 a에다가 B를 생성할 수가 있음????
포인터 쓰라에요? - DCW
아 이거 c아니 c#임
저거 안되는데... 그리고 class는 까보면 내부적으로 그냥 구조체임. 멤버 변수를 구조체의 필드 값으로써 보관하고 있는 거지. 그럼 멤버 함수는 어떻게 구현된 거냐고? 그냥 함수인데 A.method(); 처럼 호출하면 method()라는 함수에 this 포인터 변수만 A로 설정해서 호출해주는 것에 불과함.
세브 cpp로 오해했다에요? - DCW
아 맞네. public void 보니 C#네 ㅋㅋㅋ 방금 C 답변하고 와서 C++인줄 ㅋㅋ
ㅅㅅㅅ언니도 오해한모양? - DCW
C#라고 해도 객체지향의 내부 구현은 똑같아. C#의 Reference 변수는 C/C++의 포인터와 같은 거 알지? 그냥 포인터에 가비지 컬렉터를 위한 레퍼런스 카운터랑 연계시켜 놓은 게 C#의 레퍼런스 변수 개념인데 쉽게 말해서 C/C++의 포인터와 같아. 그리고 B는 A를 상속받았는데 어쨌든 class는 내부적으로 구조체에 불과해. A를 상속받은 B는
구조체로 치면 struct B { struct A _parent; ... } 식으로 class A 구조체를 첫 필드로 가지고 있다. 즉 동일 주소를 B의 참조로도 참조할 수 있고 A의 참조로도 참조할 수 있음. 어쨌든 클래스는 구조체니깐.
그러니까 객체가 레퍼런스 타입이라 가능하다는 이야기죠?
ㅇㅇ. C++로 객체지향 해봤으면 내가 무슨 얘기하는지 좀 더 직관적으로 이해할 수 있었을 텐데 아쉽다. 객체지향은 까보면 클래스는 내부적으로 구조체로 구현되어 있고 클래스 메서드는 그냥 함수인데 호출할 때 this 포인터만 해당 객체 인스턴스로 설정해서 같이 넘겨주는 거고 가상 함수는 함수 포인터 배열로 구현된 거고...
c, c++는 본적도 없어서 ㅎㅎㅎ 어째든 고맙습니다
C#도 구조체는 있으니깐 내 말의 50% 정도는 이해했을 듯. C#에서도 unsafe method에서는 pointer 쓸 수 있을텐데. 뭐 근데 보통 안 쓰니깐 포인터가 있는지도 모르는 C# 프로그래머가 꽤 있더라.
VB.NET에서도 포인터 취급하려고 IntPtr 만들긴 했는데 메모리 액세스하는 게 ㅈ같아서 ㅋㅋ 마샬링 메서드 일일이 호출해 줘야 하는 거 잼. 아 C#도 safe하게 하려면 저렇게 해야 되지 참.
구조체가 struct 명령어 쓰는거 말하는것임? 아직 안배웟어요. 목차가 다로 다음에 있네요. 이너머레이션이랑...