C++

C++에서 가상 함수(Virtual function)은 private이 가능할까?

김구티2 2024. 4. 19. 20:14

가상 함수는 C++에 액세스 제어 기능이 있으므로 private 함수일 수는 있지만 가시성 제어 기능은 없다. 앞선 글에서 말한 바와 같이, 가상 함수는 파생 클래스에 의해 재정의될 수 있지만 모든 상황에서는 기본 클래스 내에서만 호출된다.

 

예시:

// C++ program to demonstrate how a
// virtual function can be private
#include <iostream>

class base {
public:
     // default base constructor
     base() { std::cout << "base class constructor\n"; }

     // virtual base destructor
     // always use virtual base
     // destructors when you know you
     // will inherit this class
     virtual ~base()
     {
          std::cout << "base class destructor\n";
     }
     // public method in base class
     void show()
     {
          std::cout << "show() called on base class\n";
     }

     // public virtual function in base class,
     // contents of this function are printed when called
     // with base class object when called with base class
     // pointer contents of derived class are printed on
     // screen
     virtual void print()
     {
          std::cout << "print() called on base class\n";
     }
};

class derived : public base {
public:
     // default derived constructor
     derived()
          : base()
     {
          std::cout << "derived class constructor\n";
     }
     // virtual derived destructor
     // always use virtual destructors
     // when inheriting from a
     // base class
     virtual ~derived()
     {
          std::cout << "derived class destructor\n";
     }

private:
     // private virtual function in derived class overwrites
     // base class virtual method contents of this function
     // are printed when called with base class pointer or
     // when called with derived class object
     virtual void print()
     {
          std::cout << "print() called on derived class\n";
     }
};

int main()
{
     std::cout << "printing with base class pointer\n";

     // construct base class pointer with derived class
     // memory
     base* b_ptr = new derived();

     // call base class show()
     b_ptr->show();

     // call virtual print in base class but it is overridden
     // in derived class also note that print() is private
     // member in derived class, still the contents of
     // derived class are printed this code works because
     // base class defines a public interface and drived
     // class overrides it in its implementation
     b_ptr->print();

     delete b_ptr;
}

 

출력:

printing with base class pointer
base class constructor
derived class constructor
show() called on base class
print() called on derived class
derived class destructor
base class destructor

 

'b_ptr'은 Base 형식의 포인터이며 Derived 클래스 객체를 가리킨다. 포인터 'ptr->print()'가 호출되면, Derived의 함수 'print()'가 실행되는 것으로 이해할 수 있다.

728x90