티스토리 뷰

class Base
{
public:
	void Init(){printf("Base");}
};

class Inheritance : public Base
{
public:
	void Init(int a)
	{
		printf("Inheritance %d", a);
	}
};
int main(int argc, char **arv)
{
	Inheritance inheritance;
	inheritance.Init();
	return 0;
}

 
위 코드는 컴파일 에러를 발생시킨다. 내가 이 코드를 작성한 의도는 함수 오버로딩이다. 즉, 같은 이름의 함수가 여러 개가 있고, 파라미터가 다르다면 다른 함수로 인식할거라고 생각한 것이다. 그런데, 같은 이름의 함수가 있을 경우, 자식 클래스의 함수만 유효하다.

int main(int argc, char **arv)
{

	Inheritance inheritance;
	inheritance.Init(1);
	return 0;
}
위와 같이 코드를 수정하면
, 정상적으로 동작한다. 하지만, Base클래스에 존재하는 Init은 사용할 수 없어진다.

int main(int argc, char **arv)
{
	Inheritance Inheritance;
	inheritance.Base::Init();
	return 0;
}
이렇게 바꾸면, Base 클래스의 Init함수를 사용할 수 있어진다. 명시적으로 Base클래스의 Init함수를 사용한다고 알려주지 않으면, 자동으로 Inheritance클래스의 Init함수를 호출 하는 것으로 인식하기 때문에 반드시 그렇게 해주어야만 한다. 전역 변수와 지역 변수의 이름이 같을 때, 전역 변수를 사용하려면 전역 변수의 이름 앞에 ::를 붙여주어야 하는 것과 같은 이유다.

댓글