,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가 호출하는게 맞아여