C++의 가상 함수

Suraj P 2023년10월12일
  1. C++의 가상 함수
  2. C++의 가상 함수 규칙
  3. C++의 순수 가상 함수 이해
C++의 가상 함수

이 기사에서는 C++의 가상 함수에 대해 설명합니다. 가상 함수는 파생 선언에 의해 오버로드되거나 재정의되지만 기본 클래스에서 정의 및 선언되는 특수 멤버 함수입니다.

C++의 가상 함수

virtual 키워드는 기본 클래스의 함수 선언 앞에 추가됩니다. 이렇게 하면 컴파일러가 함수에 대한 동적 연결이라고도 하는 후기 바인딩을 수행합니다.

런타임 컴파일러에서 런타임 바인딩 또는 동적 연결은 개체 유형을 결정하고 함수 호출을 바인딩합니다. 간단히 말해서 런타임 중에 함수 호출이 해결되는 일종의 바인딩입니다.

런타임 다형성은 이러한 함수를 사용하여 달성됩니다. 따라서 C++의 함수가 가상으로 만들어질 때마다 런타임 시 컴파일러는 기본 클래스 포인터가 가리키는 개체를 기반으로 호출해야 하는 함수를 결정합니다.

예제 코드:

#include <bits/stdc++.h>
using namespace std;

class demo {
 public:
  virtual void fun() { cout << "Inside the base class\n"; }

  void check() { cout << "Base class function\n"; }
};

class derived : public demo {
 public:
  void fun() { cout << "Inside the derived class\n"; }

  void check() { cout << "Derived class fuction\n"; }
};

int main() {
  demo *ptr;
  derived d;
  ptr = &d;

  ptr->fun();

  ptr->check();
}

출력:

Inside the derived class
Base class function

위의 코드에서 ptr->fun()은 가상 함수이므로 런타임에 바인딩되는 반면 ptr->check()는 비가상 함수이므로 컴파일 타임에 바인딩됩니다. 여기서 런타임 다형성은 파생 클래스의 개체를 가리키는 기본 클래스 포인터를 사용하여 달성되었습니다.

C++의 가상 함수 규칙

가상 함수로 작업할 때 다음 규칙을 염두에 두어야 합니다.

  1. 가상 생성자는 가질 수 없지만 가상 소멸자는 가질 수 있습니다. 가상 소멸자를 사용하면 파생 클래스 개체가 올바른 순서로 소멸됩니다. 먼저 기본 클래스 개체가 소멸된 다음 파생 클래스가 소멸됩니다.

    예제 코드:

    #include <bits/stdc++.h>
    using namespace std;
    
    class demo {
     public:
      demo() { cout << "Constructing base class\n"; }
    
      virtual ~demo() { cout << "Destroying base class\n"; }
    };
    
    class derived : public demo {
     public:
      derived() { cout << "Constructing derived class\n"; }
    
      virtual ~derived() { cout << "Destroying the derived class\n"; }
    };
    
    int main() {
      demo *ptr;
      derived *derivedPtr = new derived();
    
      ptr = derivedPtr;
    
      delete ptr;
    }
    

    출력: 적절한 생성 및 소멸 순서를 따르는 것을 관찰할 수 있습니다.

    Constructing base class
    Constructing derived class
    Destroying the derived class
    Destroying base class
    
  1. 런타임 다형성을 달성하려는 경우 기본 클래스 포인터 또는 기본 클래스 참조만 가상 함수와 함께 사용해야 합니다.
  2. 가상 기능은 정적일 수 없습니다.
  3. 가상 함수 프로토타입은 기본 클래스와 파생 클래스에서 동일하게 유지되어야 합니다.
  4. 가상 기능은 다른 클래스의 친구 기능이 될 수도 있습니다.

C++의 순수 가상 함수 이해

이러한 기능은 원래 가상 기능의 약간의 변형입니다. 순수 가상 함수는 아무것도 하지 않는 가상 함수입니다.

통사론:

virtual void fun() = 0

순수 가상 함수는 추상 클래스를 만드는 데 사용됩니다. 이들은 개체를 만들 수 없는 클래스이며 이 클래스에서 파생되는 클래스는 순수 가상 함수를 재정의해야 합니다. 그렇지 않으면 추상 클래스로 취급됩니다.

예제 코드:

#include <bits/stdc++.h>
using namespace std;

class demo {
 public:
  virtual void fun() = 0;
};

class derived : public demo {
 public:
  void fun()  // overriding the function
  {
    cout << "Inside the derived class";
  }
};

int main() {
  demo *ptr;

  // demo d;  This will give compile error as base class demo is abstract class

  derived d;
  ptr = &d;

  ptr->fun();
}

출력:

Inside the derived class
작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

관련 문장 - C++ Function