'상속된 이름'에 해당되는 글 1건

  1. 2009.07.05 상속된 이름을 숨기는 일은 피하자. 4
[ Programming ]2009. 7. 5. 18:25
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;
}
Posted by 냉동