>  기사  >  백엔드 개발  >  템플릿 기반 C 클래스를 상속할 때 공개 클래스 멤버가 보이지 않는 이유는 무엇입니까?

템플릿 기반 C 클래스를 상속할 때 공개 클래스 멤버가 보이지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 09:25:021003검색

Why Are Public Class Members Invisible When Inheriting Templated C   Classes?

템플릿 기반 C 클래스에서 보호 및 공용 클래스 멤버 가시성 상속

클래스 템플릿이 상속할 때 상속에서 공용 멤버 가시성 문제가 명백해집니다. 제공된 코드에 예시된 것처럼 다른 클래스 템플릿의 멤버입니다. 공개 멤버를 명시적으로 다시 선언하거나 재정의하지 않고 CDerived는 CBase의 모든 공개 멤버를 상속합니다.

문제 및 솔루션

그러나 이 코드를 템플릿하면 CBase의 공개 멤버가 드러납니다. 최신 C 표준을 준수하는 컴파일러에서는 CDerived에 표시되지 않습니다. 이 가시성 문제는 여러 솔루션을 사용하여 해결할 수 있습니다.

  1. CBase
  2. CBase 멤버에 대한 참조 앞에 this->
  3. 를 접두사로 붙입니다.
  4. CDerived 내에서 특정 CBase 멤버에 대해 using 문 사용
  5. "허용" 모드를 활성화하여 C 표준에 대한 엄격한 준수 비활성화

기존 솔루션의 단점

이 솔루션은 효과적이지만 단점도 있습니다.

  • 솔루션 #4는 C 표준에서 벗어나 이식성이 없습니다.
  • 솔루션 #1 및 #2 장황한 코드 추가가 필요하여 소스 코드가 부풀어오르게 됩니다.
  • 솔루션 #3에는 특히 광범위한 기본 클래스의 경우 여러 개의 using 문이 필요합니다.

간소한 장황한 솔루션

매크로를 도입하면 솔루션 #3이 단순화되어 반복 입력이 줄어듭니다.

<code class="cpp">#include <boost/preprocessor.hpp>

#define USING_ONE(r, base, member) using base::member;
#define USING_ALL(base, ...) BOOST_PP_SEQ_FOR_EACH(USING_ONE, base, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

// Near CBase<BYTES>
#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>
USING_CBASE(BYTES);</code>

이 코드는 using 문을 크게 단순화하여 코드 가독성을 높이고 반복 편집을 줄입니다.

위 내용은 템플릿 기반 C 클래스를 상속할 때 공개 클래스 멤버가 보이지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.