logo

C++ 가상 함수

  • C++ 가상 함수는 파생 클래스에서 다시 정의하는 기본 클래스의 멤버 함수입니다. virtual 키워드를 사용하여 선언됩니다.
  • 이는 컴파일러에게 함수에 대한 동적 연결 또는 후기 바인딩을 수행하도록 지시하는 데 사용됩니다.
  • 다양한 클래스의 모든 개체를 참조하려면 단일 포인터를 사용해야 합니다. 따라서 모든 파생 개체를 참조하는 기본 클래스에 대한 포인터를 만듭니다. 그러나 기본 클래스 포인터에 파생 클래스 객체의 주소가 포함되어 있으면 항상 기본 클래스 함수를 실행합니다. 이 문제는 '가상' 기능을 사용해야만 해결할 수 있습니다.
  • '가상'은 함수의 일반적인 선언 앞에 오는 키워드입니다.
  • 함수가 가상으로 만들어지면 C++에서는 기본 클래스 포인터가 가리키는 개체의 형식을 기반으로 런타임에 호출할 함수를 결정합니다.

후기 바인딩 또는 동적 연결

런타임에 바인딩 기능 호출이 런타임 중에 해결됩니다. 따라서 컴파일러는 런타임에 개체 유형을 결정한 다음 함수 호출을 바인딩합니다.


가상 함수의 규칙

아파치
  • 가상 함수는 일부 클래스의 멤버여야 합니다.
  • 가상 함수는 정적 멤버일 수 없습니다.
  • 객체 포인터를 통해 액세스됩니다.
  • 그들은 다른 클래스의 친구가 될 수 있습니다.
  • 가상 함수는 사용되지 않더라도 기본 클래스에 정의되어야 합니다.
  • 기본 클래스와 모든 파생 클래스의 가상 함수 프로토타입은 동일해야 합니다. 이름은 같지만 프로토타입이 다른 두 함수가 있는 경우 C++에서는 이를 오버로드된 함수로 간주합니다.
  • 가상 생성자는 가질 수 없지만 가상 소멸자는 가질 수 있습니다.
  • virtual 키워드를 사용하지 않는 상황을 생각해 보세요.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>

산출:

 Value of x is : 5 

위의 예에서 * a는 기본 클래스 포인터입니다. 포인터는 기본 클래스 멤버에만 액세스할 수 있고 파생 클래스의 멤버에는 액세스할 수 없습니다. C++에서는 기본 포인터가 기본 클래스에서 파생된 개체를 가리키는 것을 허용하지만 파생 클래스의 멤버에 직접 액세스할 수는 없습니다. 따라서 기본 포인터가 파생 클래스의 멤버에 액세스할 수 있도록 하는 가상 함수가 필요합니다.

C++ 가상 함수 예

프로그램에서 파생 클래스를 호출하는 데 사용되는 C++ 가상 함수의 간단한 예를 살펴보겠습니다.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>

산출:

 Derived Class is invoked 

순수 가상 함수

  • 가상 기능은 작업을 수행하는 데 사용되지 않습니다. 자리 표시자 역할만 합니다.
  • 함수에 정의가 없는 경우 해당 함수를 ''라고 합니다. 아무것도하지 마세요 ' 기능.
  • ' 아무것도하지 마세요 ' 함수는 다음과 같이 알려져 있습니다. 순수 가상 함수 . 순수 가상 함수는 기본 클래스에 관련된 정의가 없는 기본 클래스에 선언된 함수입니다.
  • 순수 가상 함수를 포함하는 클래스는 자체 객체를 선언하는 데 사용할 수 없습니다. 이러한 클래스를 추상 기본 클래스라고 합니다.
  • 기본 클래스의 주요 목적은 파생 클래스에 특성을 제공하고 런타임 다형성을 달성하는 데 사용되는 기본 포인터를 만드는 것입니다.

순수 가상 함수는 다음과 같이 정의할 수 있습니다.

 virtual void display() = 0; 

간단한 예를 살펴보겠습니다.

안드로이드에서 애플리케이션 숨기기를 해제하는 방법
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>

위의 예에서 기본 클래스에는 순수 가상 함수가 포함되어 있습니다. 따라서 기본 클래스는 추상 기본 클래스입니다. 기본 클래스의 객체를 생성할 수 없습니다.