가상 및 순수 가상 함수 이해
가상 함수는 런타임 다형성을 지원함으로써 객체 지향 프로그래밍에서 중요한 역할을 합니다. Wikipedia에서 정의한 대로 가상 함수는 동적 디스패치를 허용하는 재정의 가능한 메서드 또는 함수입니다. 즉, 실행될 특정 함수는 컴파일 타임이 아닌 런타임에 객체 유형에 따라 결정됩니다.
비가상 함수와 달리 파생 클래스에서 가상 함수를 재정의하는 경우 , 가장 많이 파생된 클래스에 정의된 버전이 클래스 계층 전체에서 사용됩니다. 이렇게 하면 함수의 가장 구체적인 구현이 항상 활용됩니다.
순수 가상 메서드라고도 알려진 순수 가상 함수는 이 개념을 더욱 발전시킵니다. 이는 해당 클래스가 추상 클래스가 아닌 경우 파생 클래스에서 구현되어야 하는 가상 함수입니다. 따라서 순수 가상 함수는 파생 클래스에 특정 동작이 존재하도록 효과적으로 요구합니다.
추상 클래스는 하나 이상의 순수 가상 함수를 포함하는 클래스입니다. 이러한 클래스는 직접 인스턴스화할 수 없습니다. 대신 모든 순수 가상 함수에 대한 구현을 제공하는 파생 클래스를 사용해야 합니다.
가상 함수와 순수 가상 함수의 차이점을 설명하려면 다음 C를 고려하세요. 코드:
Base.hpp:
struct Base { virtual ~Base() = default; virtual void foo() { std::cout << "Base::Foo" << std::endl; } };
파생 d.hpp:
struct Derived : public Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
main.cpp:
int main() { Base base; base.foo(); // Calls Base::Foo Derived derived; derived.foo(); // Calls Derived::Foo Base* derived_as_base = &derived; derived_as_base->foo(); // Calls Derived::Foo (due to dynamic dispatch) }
In 이 코드에서 Base 클래스에는 "Base::Foo"를 인쇄하는 가상 함수 foo가 포함되어 있습니다. Derived 클래스는 이 함수를 재정의하여 "Derived::Foo"를 인쇄합니다. Base 객체가 foo를 호출하면 출력은 "Base::Foo"입니다. 그러나 Derived 객체(기본 포인터로 액세스됨)가 foo를 호출하면 동적 디스패치로 인해 출력은 "Derived::Foo"입니다.
이제 순수 가상 객체를 고려해 보겠습니다. 함수:
PureBase.hpp:
struct PureBase { virtual ~PureBase() = default; virtual void foo() = 0; // Pure virtual function };
PureDerived.hpp:
struct PureDerived : public PureBase { void foo() override { std::cout << "PureDerived::Foo" << std::endl; } };
이 코드에서, PureBase 클래스에는 기본 클래스에 정의되지 않은 순수 가상 함수 foo가 포함되어 있습니다. 결과적으로 PureBase 클래스는 완전한 구현이 부족하기 때문에 추상적입니다.
PureMain.cpp:
int main() { // error: cannot declare variable 'pureBase' to be of abstract type 'PureBase' // PureBase pureBase; // pureBase.foo(); PureDerived pureDerived; pureDerived.foo(); // Calls PureDerived::Foo }
이 예에서는 PureBase 인스턴스화를 시도합니다. 개체가 직접적으로 컴파일러 오류를 발생시킵니다. 그러나 PureDerived 객체 생성은 foo 함수에 대한 구현을 제공하기 때문에 허용됩니다.
요약하자면 가상 함수는 동적 디스패치를 제공하며 파생 클래스에서 재정의될 수 있습니다. 반면 순수 가상 함수는 파생 클래스에서 구현되고 특정 동작을 적용해야 합니다. 이러한 개념은 객체 지향 프로그래밍에서 다형성 기능을 활성화하는 데 중요한 역할을 합니다.
위 내용은 객체 지향 프로그래밍에서 가상 함수와 순수 가상 함수의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!