>백엔드 개발 >C++ >C 파생 클래스 상속에서 함수 이름 충돌을 해결하는 방법은 무엇입니까?

C 파생 클래스 상속에서 함수 이름 충돌을 해결하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-30 13:40:16633검색

How to Resolve Function Name Collision in C   Derived Class Inheritance?

파생 클래스 상속의 함수 이름 충돌

다음 코드 조각을 고려하세요.

class A { public: void foo(string s) {} };
class B : public A { public: int foo(int i) {} };
class C : public B { public: void bar() { string s; foo(s); } };

이 코드를 컴파일할 때 , 컴파일러는 다음을 생성합니다. 오류:

error: no matching function for call to 'C::foo(std::string&)'
candidates are: int B::foo(int)

이 오류는 함수 이름 섀도잉 때문에 발생합니다. 파생 클래스 B가 기본 클래스 A의 함수와 동일한 이름의 함수를 정의하면 파생 클래스 함수가 ​​기본 클래스 함수를 숨깁니다.

이름 조회 범위

클래스 범위에서 이름 조회는 다음 단계를 따릅니다.

  1. 클래스 및 해당 기본에서 이름에 대한 모든 선언을 고려합니다.
  2. 기본 클래스의 다른 선언에 의해 숨겨진 선언을 제거합니다.

해결책

함수 이름 충돌을 해결하려면 다음을 수행합니다. 파생 클래스의 범위에서 기본 클래스 함수를 다시 선언합니다. 이렇게 하면 파생 클래스와 그 하위 클래스 내에서 두 함수가 모두 표시됩니다.

class A { public: void foo(string s) {} };
class B : public A { public: int foo(int i) {}; using A::foo; };
class C : public B { public: void bar() { string s; foo(s); } };

A::foo;를 사용하여 추가하면 기본 클래스 A의 foo 함수를 파생 클래스에서도 사용할 수 있도록 지정합니다. class B. 이제 코드는 오류 없이 컴파일됩니다.

추가 참고

  • 표준에서는 클래스 범위의 이름 조회를 다음과 같이 정의합니다.
"다음 단계에서는 클래스 범위 C의 이름 조회 결과를 정의합니다. 먼저, 클래스와 해당 기본 클래스 하위 개체 각각에 있는 이름에 대한 모든 선언이 하나의 하위 개체 B에 있는 멤버 이름 f가 하위 개체에 있는 멤버 이름 f를 숨기는 것을 고려합니다. A가 B의 기본 클래스 하위 개체인 경우 A입니다."
  • 액세스 제어 전에 이름 조회가 발생합니다. 따라서 B의 foo 함수가 비공개이더라도 A의 foo 함수는 여전히 발견되지 않습니다.

위 내용은 C 파생 클래스 상속에서 함수 이름 충돌을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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