C +++의 보호 클래스에서 상속
-
03-07-2019 - |
문제
다음 선언이 있다고 가정합니다.
class Over1
{
protected:
class Under1
{
};
};
다음을 수행 할 수 있다는 것을 알고 있습니다.
class Over2 : public Over1
{
protected:
class Under2 : public Under1
{
};
};
그러나 2 세 이상없이 미만을 선언하는 방법이 있습니까?
미만의 미분을 사용하기 위해 1 이상을 연장해야하기 때문에 이것은 어리석은 것처럼 보일 수 있지만,이 상황에서는 30 개의 다른 맛이있을 수 있습니다. 나는 둘 중 하나를 할 수있다 :
- Over2가 1 ~ 2 개만 사용할 수 있으므로 매력적이지 않아서 모두 매력적이지 않습니다.
- 그들 각각을 그들 자신의 버전에 넣으십시오. 그 이후로 매력적이지 않아서 거의 같은 클래스에서 상속을 곱해야합니다.
- 1 세 이상의 자녀를 만들지 않고 1 세 미만의 자녀를 창조하는 방법을 찾으십시오.
그래서 이것이 가능합니까?
감사.
해결책
템플릿과 명백한 전문화를 사용하면 1 이상의 추가 클래스 선언으로이를 수행 할 수 있습니다.
class Over1
{
protected:
class Under1
{
};
template <typename T>
class UnderImplementor;
};
struct Under2Tag;
struct Under3Tag;
struct Under4Tag;
template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};
template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};
도움이 되었기를 바랍니다.
다른 팁
중첩 클래스를 만드는 것보다 더 나은 클래스를 네임 스페이스에 포함시키는 것을보고 싶을 수도 있습니다. 그렇게하면 내부 클래스를 얻기 위해 외부 클래스가 필요하지 않습니다. 그리고 Google C ++ 스타일 가이드.
1 이하 보호를 유지하려면 정의에 따라이를 접근하려면 Overs1에서 상속해야합니다. Douglas가 제안한대로 1 세 미만을 공개하거나 네임 스페이스를 사용하는 것이 좋습니다.
나는 지금 이것을 테스트 할 컴파일러가 없기 때문에 이것이 효과가있을 것이라고 확신하지는 않지만 이것을 시도 할 수 있습니다.
class Over1
{
protected:
class Under1
{
};
public:
class Under1Interface : public Under1
{
};
};
class Under2 : public Over1::Under1Interface
{
};
또는 아마도 다음과 같은 것 :
class Over1
{
protected:
class Under1
{
};
};
class Under2 : private Over1, public Over1::Under1
{
};
또는:
class Under2;
class Over1
{
friend class Under2;
protected:
class Under1
{
};
};
class Under2 : public Over1::Under1
{
};
비록 그것이 모든 1 명 이상의 개인을 2 위에 노출시킬 것이지만, 당신이 원하는 것이 아닐 수도 있습니다.
나에게 약간 펑키 한 디자인처럼 들린다. 코드를 다르게 구조화 해보십시오. 나는 이것이 데코레이터 패턴의 좋은 후보 일 수 있다고 생각합니다. 여기서 다양한 데코레이터로 기본 클래스를 감싸서 원하는 기능을 달성 할 수 있습니다. 코드의 의도에 대해 더 많이 알지 못하고 말하기 어렵습니다.