,B,C라는 객체가 있는데
B는 A를 상속하고 C는 B를 상속합니다.
A에는 함수 P가 있고
B에는 함수 P,Q와 F,G가 있는데 함수 F에서는 P가 실행이되고 함수 G에서는 Q가 실행이 됩니다.
그리고 C에는 함수 P,Q가 있습니다.
이때 C라는 인스턴스를 생성하고 F를 호출하였을때 P함수가 실행되지 않습니까? 그때는 B의 P함수가 실행이 되는겁니까? 아니면 C의 P함수가 실행이 되는건가요??
답변좀 부탁드리겠습니다.
읽어주셔서 감사합니당~
---------------------
C++ 멤버함수가 다음과 같이있을때
class classType{
int a;
public :
void FunctionA(){ a++;}
static void FunctionB(){ a++ ;} //Error
}
가 있으면 FunctionA 의 정확한파라미터는
FunctionA(const classType* thisPointer) 식임.
인스턴스변수를 다음과 같이 다루면
classType a;
a.FunctionA();
하면 내부적으로 a++ 이호출되는데 이 a++을 좀더 정확히표현하면 (this->a)++; 이되는거지
a에서 펑션콜을할때 내부적으로 &a 가 첫번째 파라미터로들어가는거지. 이원리로 클래스에 대한 멤버변수는 따로따로메모리가 잡히지만 함수는 힙영역인가에 하나만잡혀서
호출됨. 즉, 멤버변수는 클래스마다 다를지언정 멤버함수자체는 다르지않기때문에 멤버함수는 딱 하나만 메모리에잡힌다 그거지여.
그래서 정적함수 FunctionB를 호출하면 에러가 나는이유가 멤버변수가아니기때문에 어떤 인스턴스 변수에 대한 a변수를 다룰지 모르기 떄문에 에러가 나는거고
이를 좀더 정확히표시해주면
static void FunctionB(const classType* thisParameter) { (thisParameter->a)++;} 을 해주면 FunctionA와 용도가 똑같아지긴하는거지요.
그럼 다시 원래대로 돌아와서 상속도 마찬가지긴해요.
결국 A가 B를상속하고 C가 B를상속해도 이클래스들에 대한 함수 테이블을 동일하게되요.
그래서 C* c = new C(); 를하고 C->F();함수를 호출해도 thisCall 이 C이기 때문에c가 호출하는게 맞다고 생각함.
A* ap = new C();를 해서 A->P(); 를 호출해도 a클래스타입의 함수가 호출되는게 이런 이유때문인데
여기서 virtual 키워드를 붙여서 가상함수가 생성되면 각 클래스별로 가상함수테이블이 들어가서 좀더 특수하게 처리되요
결론은 C에서 F를 호출하게되고 이 F가 다시 B클래스의 Q함수를 호출하게되도 thiscall은 모두 C가되기때문에 C가 호출하는게 맞아여
어..근데 제가밑에올린거처럼 B꺼호출하잖음? B에서 강제로 C꺼 쓸려고 C::해도 접근도안되고... 내가 잘못이해하고 잘못만든건가?
상속을받아서 상위클래스의 함수를 쓸수있어요 그리고 전역으로설정하지않는이상 C:: 키워드로접근할수는없어요. static test(); 해서 C::test() 처럼호출할수는있어도 전역이아닌데 그렇게호출은 불가능하져
그 질문자 답변은 그럼 B의 P호출이 맞는것아닌? 제말은 C의 P는 명시적으로도 접근이안될뿐더러 (virtual같은걸 질문자가언급한것도아니고 질문조건대로 보자면) B의 P가 실제로호출되고 (제가 써논게맞다면) 저렇게되니까..
좀더 정확히말하면 A건 B건 C건 상속받으면 하나의 함수테이블이 생길뿐이고 거기에 따른 this인자만 달라질뿐인거죠
B의 P나 C의 P는 사실 의미없어영 다같은함수일뿐이니까요. 물론 오버라이딩하면 따로 가지고있긴하지만요
되요->돼요 (되어 = 돼임)[리듬 맞춤법 봇♬]
되도->돼도 (되어 = 돼임)[리듬 맞춤법 봇♬]