>백엔드 개발 >C++ >C에서 같은 이름의 여러 상속 함수가 오버로드되지 않는 이유는 무엇입니까?

C에서 같은 이름의 여러 상속 함수가 오버로드되지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-21 16:17:09604검색

Why Don't Multiple Inherited Functions with the Same Name Overload in C  ?

동일한 이름을 가진 여러 상속 함수: 왜 오버로드되지 않습니까?

C에서 여러 클래스가 이름은 같지만 서명이 다른 함수를 상속하는 경우 , 컴파일러는 이러한 함수를 오버로드된 함수가 아닌 고유한 멤버로 처리합니다. 이로 인해 파생 클래스에서 함수를 호출할 때 모호함이 발생합니다.

다음 예를 고려하세요.

struct Base1 {
  void foo(int);
};

struct Base2 {
  void foo(float);
};

struct Derived : public Base1, public Base2 {
};

여기서 Base1과 Base2는 모두 서로 다른 매개변수를 사용하여 foo라는 함수를 정의합니다. 파생 클래스 Derived에서 d.foo(5)를 호출하면 컴파일러에서 "모호한 호출" 오류가 발생합니다.

함수 시그니처가 동일해야 하는 재정의와 달리 오버로드는 이름이 같은 함수를 허용하지만 다른 매개변수. 그러나 이 규칙은 여러 상속된 함수에는 적용되지 않습니다.

C 멤버 조회 규칙에 따르면 파생 클래스에 동일한 멤버 이름의 선언이 여러 개 있는 경우 서로 다른 기본 클래스의 선언은 모호한 것으로 간주됩니다. 이는 선언이 모두 동일한 유형의 하위 개체에서 나온 것이 아니거나 고유한 하위 개체의 비정적 멤버가 있는 경우에 발생합니다.

이 모호성을 해결하려면 using 선언을 사용하여 명시적으로 지정할 수 있습니다. 어떤 기본 클래스의 함수를 호출해야 하는지:

struct Derived : public Base1, public Base2 {
  using Base1::foo;
  using Base2::foo;
};

int main() {
  Derived d;
  d.foo(5); // Calls Base1::foo(int)
  d.foo(5.0f); // Calls Base2::foo(float)
}

두 번째 코드 조각에서는 제공됨:

struct Base {
  void foo(int);
};

struct Derived : public Base {
  void foo(float);
};

Derived의 foo(float) 함수는 기본 클래스의 foo(int) 함수를 재정의합니다. 따라서 d.foo(5)를 호출하면 foo(float) 함수가 모호함 없이 올바르게 호출됩니다.

위 내용은 C에서 같은 이름의 여러 상속 함수가 오버로드되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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