나만의 작은 도서관
[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;
}