나만의 작은 도서관

[TIL][C++] 250512 MMO 서버 개발 15일차: C++의 접근제어 규칙 - “설계에 의한 계약” (Design by Contract)”(virtual 키워드 관련) 본문

Today I Learn

[TIL][C++] 250512 MMO 서버 개발 15일차: C++의 접근제어 규칙 - “설계에 의한 계약” (Design by Contract)”(virtual 키워드 관련)

pledge24 2025. 5. 13. 00:51
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

C++의 접근제어 규칙 - “설계에 의한 계약” (Design by Contract)”(virtual 키워드 관련)

  • C++에서 사용하는 대표적인 접근 제어 키워드는 public, protected, private이 있다. 이때 각 접근 제어에 포함된 멤버 함수들은 virtual 키워드를 통해 가상 함수로 지정할 수 있다.
  • 가상 함수는 상속받은 클래스가 재정의 하였을 때, 해당 함수를 상위 클래스에서 호출해도 상속받은 클래스에서 정의한 내용이 호출되도록 하는 기능이다. 그렇다면 상속받은 클래스에서 가상 함수를 재정의할 때 더 느슨한 접근 권한으로 지정할 수 있을까?
  • 가능하다. 왜냐하면 상속을 통해 함수의 접근 제어 수준을 높여 인터페이스를 확장해도 **“설계에 의한 계약”(Design by Contract)”**을 위반하지 않기 때문이다. 따라서 정리하자면 아래와 같다.
C++의 접근 제어 규칙
- 상속 시 접근 지정자를 더 제한적으로 바꾸는 것은 불가능하다. (ex. public -> protected)
- 상속 시 접근 지정자를 더 개방적으로 바꾸는 것은 가능하다. (ex. protected -> public)

예시

class Base
{
public:
    void callFunc1() { func1(); }

protected:
    virtual void func1() { cout << "func1" << '\\n'; }

private:
    int _BaseA = 10;
};

class Derived : public Base
{
public:
    virtual void func1() override { cout << "func_Derived" << '\\n'; }
};

int main(void)
{

    Derived* derived = new Derived();

    derived->func1();               // 가능 : func_Derived
    // ((Base*)derived)->func1();   // 불가능!
    ((Base*)derived)->callFunc1();  // 가능 : func_Derived

    return 0;
}