C++ - 자식 클래스에서 오버라이드한 멤버함수의 접근 지정이 부모 클래스의 멤버함수와 다른 경우
class Base
{
public :
virtual void f() { }
} ;
class Derived : public Base
{
private :
void f() { }
} ;
int main()
{
Derived d ;
d.f(); // 1. ?
Base & ref = d ;
ref.f(); // 2. ?
return 0;
}
1번은 에러.
2번 virtual 함수의 접근 조사는 호출 시점에서의 선언에 의해 정적으로 결정된다. 그래서 main()에서 Base::f로는 접근할 수 있으므로 ref.f()는 에러가 되지 않으며 virtual 함수 호출에 의해 Derived의 f를 호출한다.
이 글은 2020-07-09에 작성되었습니다.