가상 함수는 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()'가 실행되는 것으로 이해할 수 있다.
'C++' 카테고리의 다른 글
C++ 클래스를 이용한 예외 처리 (0) | 2024.04.24 |
---|---|
C++ 예외 처리(Exception Handling) 총정리 (0) | 2024.04.23 |
C++ RTTI(Run-Time Type Information) 총정리 (0) | 2024.04.19 |
C++ 정적 함수의 가상화 여부 총정리 (0) | 2024.04.15 |
C++ 순수 가상 함수와 추상 클래스 총정리 (0) | 2024.04.15 |