섀도 잉이 좋지 않거나 잘 작동하는지 여부는 충돌하는 이름을 도입 한 순서에 따라 다릅니다. 이 경우
class DerivedA : public Base {
private:
int a;
};
:
은 클래스 라이브러리가 있다고 가정하고, 클래스 중 하나는 이것이다 :
이
struct Base {
int a;
};
나중에, 클래스 라이브러리를 사용하는 고객 A는이 기록 음영 처리가 의도하지 않은 것일 수 있습니다. 고객이 실수로 Base::a
을 (를) 음영 처리했습니다. 지금까지 너무 좋아
class DerivedB : public Base {
private:
int b;
};
:
그러나, 당신은 또한이 기록 고객 B를 있다고 가정합니다. 이제 라이브러리를 구축하여 Base
개체를 사용하고 고객 B는 라이브러리를 사용하여 Base
및 DerivedB
개체를 모두 사용하는 코드 본문을 작성합니다.
몇 주 후 새로운 기능을 사용하려면 Base
에 새 회원을 추가해야한다는 것을 알고 있습니다.
struct Base {
int a;
int b; // new member variable
};
이로 인해 라이브러리에 문제가 있습니까? 고객 B에게 문제가 발생합니까?
아니요, 문제가되지 않습니다.
Base
이 Base
을 계속 사용할 것, 그것은 멋진 새 b
기능을 얻을 수있는 b
멤버를 사용할 수 있습니다 사용하는 코드의 모든
.
DerivedB
개체가
Base
이 필요한 함수로 전달 된 경우에도
Derived
이 섀도 잉
b
이라는 사실은
Base
에 영향을 미치지 않습니다.
Base
을 사용하는 함수는
b
이라고 말할 수 있으며
Base
멤버 변수에 액세스합니다.
한편, DerivedB
이 DerivedB
를 계속 사용합니다 사용하고, 그 코드가 b
를 말할 때, 그것은 이전에 그랬던 것처럼, DerivedB::b
를 얻을 고객 B의 모든 코드. 휴, 그림자가 그날을 구 했어요!
(물론 고객 B가 새로운 b
기능을 사용하기를 원한다면 고객 B는 충돌을 해결하기 위해 추가 작업을해야합니다.) 그러나 중요한 것은 섀도 잉이 새로운 문제를 생성하지 않는다는 것입니다 기존 코드에서)
섀도 잉이 좋은지 나쁜지간에 충돌이있는 이름을 도입 한 순서에 따라 달라집니다. 이것은 컴파일러가 이해할 수있는 것이 아닙니다.
gcc도 경고를 제공하지는 않지만 재미있는 점은이 동작이 다형성과 관련하여 전반적으로 어떻게 작용해야하는지입니다. – Starl1ght
예 에서처럼 'private'가없는 경우에도 변수를 섀도 잉하는 것은 거의 항상 실수라고 생각합니다. [clang] (https://llvm.org/bugs/show_bug.cgi?id=31222)과 [gcc] (https://gcc.gnu.org/bugzilla/show_bug.cgi?)에 대한 기능 요청을 모두 제출했습니다. id = 78632). –
@VittorioRomeo'Derived '가 쓰여질 때'Base'에'a'가 없다면 실수가 아닙니다. –