int x = 0;
void TestFunc()
{
float x = 0;
std::cin >> x;
}
// test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
class Base
{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(const int i)
{
}
virtual void mf2()
{
}
void mf3()
{
}
void mf3(const int i)
{
}
};
class Derived : public Base
{
public:
//using Base::mf1;
//using Base::mf3;
virtual void mf1()
{
}
void mf3()
{
}
void mf4()
{
/*
어느 것에 대한 이름인지를 파악해야 하는 것이 우선.
출처 파악을 위해, 컴파일러는 mf2라는 이름이 붙은 것의
선언문이 들어 있는 유효 범위를 탐색하는 방법을 사용함.
1. 지역 유효범위(mf4의 유효범위) - 없음.
2. Derived 클랫의 유효범위 - 없음.
3. Base 클래스의 유효범위 - 있음.
만약, Base클래스의 유효 범위에서도 찾지 못한다면, Base를
둘러 싸고 있는 네임스페이스로 가서 탐색하고 거기도 없으면
전역 유효범위까지 감.
*/
mf2();
}
};
/*
위에서 기본 클래스에 있는 함수들 중에 mf1 및 mf3이라는 이름이 붙은
것은 모두 파생 클래스에 들어 있는 mf1 및 mf3에 의해 가려짐.
매개변수 타입이 틀려도 이름이 같으면 가려짐.
가상 함수인지 비가상 함수인지의 여부에도 상관없이 이름이 가려짐.
가려진 이름은 using 선을 써서 피 할수 있음.
- using Base::mf1;
- using Base::mf3;
*/
int _tmain(int argc, _TCHAR* argv[])
{
Derived d;
int x = 0;
d.mf1();
d.mf1(x); /// 에러 Derived::mf1이 Base::mf1을 가림.
d.mf2();
d.mf3();
d.mf3(x); /// 에러 Derived::mf3이 Base::mf3을 가림.
return 0;
}