> 백엔드 개발 > C++ > 이름은 동일하지만 서명이 다른 여러 상속 함수가 C에서 어떻게 해결됩니까?

이름은 동일하지만 서명이 다른 여러 상속 함수가 C에서 어떻게 해결됩니까?

Susan Sarandon
풀어 주다: 2024-12-14 00:04:14
원래의
550명이 탐색했습니다.

How Do Multiple Inherited Functions with Identical Names but Different Signatures Resolve in C  ?

동일한 서명을 가진 여러 상속 함수가 오버로드되지 않음

객체 지향 프로그래밍에서 상속을 사용하면 클래스가 상위 클래스의 속성과 메서드를 상속받을 수 있습니다. 그러나 여러 상속된 클래스에 이름은 같지만 서명이 다른 함수가 있는 경우 일반적인 문제가 발생합니다.

문제

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

#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿