동일한 서명을 가진 여러 상속 함수가 오버로드되지 않음
객체 지향 프로그래밍에서 상속을 사용하면 클래스가 상위 클래스의 속성과 메서드를 상속받을 수 있습니다. 그러나 여러 상속된 클래스에 이름은 같지만 서명이 다른 함수가 있는 경우 일반적인 문제가 발생합니다.
문제
다음 코드 조각을 고려하세요.
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
이 코드는 "foo에 대한 모호한 호출" 오류를 생성합니다. 이는 foo에 대한 호출을 해결할 수 없음을 나타냅니다. 이름은 같지만 서명이 다른 상속 함수가 여러 개 있습니다.
설명
C 멤버 조회 규칙에 따르면 클래스가 여러 기본 클래스에서 상속되고 다음이 있는 경우 동일한 이름에 대한 여러 선언이 있는 경우 숨겨진 선언은 모두 제거됩니다. 결과 선언 집합이 다른 유형에 속하거나 고유한 기본 클래스의 비정적 멤버를 포함하는 경우 모호성이 발생합니다.
위의 예에서 Base1과 Base2는 모두 foo 함수를 정의하지만 서명이 다릅니다. Derived가 Base1 및 Base2에서 상속하는 경우 foo에 대해 서로 다른 유형의 두 가지 고유한 선언이 있습니다. 이로 인해 모호성이 발생하여 컴파일 오류가 발생합니다.
해결 방법
모호성을 해결하려면 using 선언을 사용하여 사용할 기본 클래스의 foo 버전을 지정할 수 있습니다. 예를 들면 다음과 같습니다.
class Derived : public Base1, public Base2 { using Base1::foo; };
이 using 선언은 Base1의 foo 함수가 Derived에서 사용되도록 보장합니다.
Gotcha
제공한 두 번째 코드 조각에서 Derived 클래스에는 foo 함수(float 매개변수 포함)가 하나만 있습니다. 이는 Base1의 foo 함수가 Derived의 foo 함수에 의해 숨겨져 있기 때문입니다. 따라서 d.foo(5)는 Base1이 아닌 Derived의 float 매개변수를 사용하여 foo 함수를 호출합니다.
따라서 제목의 질문에 답하기 위해 이름은 같지만 서명이 다른 여러 상속 함수는 호출되지 않습니다. 모호함을 초래할 수 있으므로 오버로드된 함수로 처리됩니다. 대신, 컴파일러는 사용해야 하는 함수를 지정하기 위해 선언 또는 기타 기술을 사용하여 명시적인 해결을 요구합니다.
위 내용은 이름은 동일하지만 서명이 다른 여러 상속 함수가 C에서 어떻게 해결됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!