[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
" 상속 관계에서의 데이터 멤버, 멤버 함수의 유효범위에 따른 동작을 생각하며 구성하자! "
- 파생 클래스의 이름은 기본 클래스의 이름을 가린다!
- public 상속에서 이름 가림 현상은 바람직하지 않다!
- 가려진 이름을 다시 볼 수 있게 하는 방법으로는 using선언 혹은 전달 함수를 쓰면 된다!
int x;
void someFunc()
{
double x;
cin >> x;
}
class Base
{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf2();
void mf3();
...
};
class Derived : public Base
{
public:
virtual void mf1();
void mf4();
...
};
void Derived::mf4()
{
...
mf2();
...
}
class Base
{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};
class Derived : public Base
{
public:
virtual void mf1();
void mf3();
void mf4();
...
};
Derived d;
int x;
...
d.mf1(); // Derived::mf1 호출
d.mf1(x); // Derived::mf1이 Base::mf1을 가린다
d.mf2(); // Basse::mf2 호출
d.mf3(); // Derived::mf3 호출
d.mf3(x); // Derived::mf3이 Base::mf3을 가린다
class Base
{
private:
int x;
public:
virtual void mf1() = 0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
...
};
class Derived : public Base
{
public:
using Base::mf1;
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
...
};
class Base
{
public:
virtual void mf1() = 0;
virtual void mf1(int);
...
};
class Derived : private Base
{
public:
virtual void mf1()
{ Base::mf1(); }
...
};
using 선언으로는 해결 불가
- using 선언 시 그 이름에 해당하는 것들이 모두 파생 클래스로 내려가기 때문
private 상속과 간단한 전달 함수를 만들자
- [ 항목 39 : private 상속은 심사숙고해서 구사하자 ] 참조
- 전달 함수는 using 선언을 사용하지 못하는 컴파일러에서 우회적으로 해결하기 위해서도 사용