[c++] 가상 함수의 가시성(visibility)과 접근 지정자

1. 가상 함수의 가시성(Visibility)

가상 함수의 가시성은 파생 클래스에서 해당 함수를 호출할 때, 어떤 멤버 함수가 호출되는지를 결정합니다. 파생 클래스에서 가상 함수를 오버라이드할 때, 기본 클래스에서 선언된 가상 함수와 동일한 시그니처를 가져야 합니다.

가상 함수 선언의 가시성은 기본 클래스에서 public, protected, 또는 private으로 선언될 수 있습니다. 파생 클래스에서 이러한 가시성을 상속받게 됩니다.

다음은 가시성에 따른 예제입니다.

class Base {
public:
    virtual void display() {
        cout << "Base::display()" << endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        cout << "Derived::display()" << endl;
    }
};

위의 예제에서 Base 클래스의 display 함수가 public으로 선언되어 있고, Derived 클래스에서는 public 상속을 받았기 때문에 Derived::display 함수가 호출될 수 있습니다.

2. 접근 지정자(Access Specifier)

가상 함수의 접근 지정자는 그 함수에 대한 접근을 제한합니다. public으로 선언된 가상 함수는 클래스의 외부에서 호출될 수 있지만, private으로 선언된 가상 함수는 클래스 외부에서 직접 호출될 수 없습니다.

아래는 접근 지정자에 따른 예제입니다.

class Base {
public:
    virtual void display_public() {
        cout << "Base::display_public()" << endl;
    }

private:
    virtual void display_private() {
        cout << "Base::display_private()" << endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        display_private(); // Compile error: 'virtual void Base::display_private()' is private within this context
    }
};

위의 예제에서 Base 클래스의 display_public 함수는 public으로, display_private 함수는 private으로 선언되어 있습니다. 파생 클래스에서 Base 클래스의 display_public 함수에 접근하는 것은 문제가 없지만, display_private 함수에 직접 접근하려고 하면 컴파일 에러가 발생합니다.

이렇듯, 가상 함수의 가시성과 접근 지정자는 클래스의 상속과 멤버 함수 호출에 중요한 영향을 미치므로, 적절한 사용 방법을 숙지하는 것이 중요합니다.

참고 자료: cplusplus.com - Virtual Functions