파생 클래스 상속의 함수 이름 충돌
다음 코드 조각을 고려하세요.
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의 함수와 동일한 이름의 함수를 정의하면 파생 클래스 함수가 기본 클래스 함수를 숨깁니다.
이름 조회 범위
클래스 범위에서 이름 조회는 다음 단계를 따릅니다.
해결책
함수 이름 충돌을 해결하려면 다음을 수행합니다. 파생 클래스의 범위에서 기본 클래스 함수를 다시 선언합니다. 이렇게 하면 파생 클래스와 그 하위 클래스 내에서 두 함수가 모두 표시됩니다.
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입니다."
위 내용은 C 파생 클래스 상속에서 함수 이름 충돌을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!