Open CharmStrange opened 1 year ago
상속이 필요한데, 하필 기본 클래스의 멤버 함수와 파생 클래스의 멤버 함수의 이름이 같아야 한다면, 또는 파생 클래스에서 기본 클래스와 동일한 형식의 함수를 재정의해야 한다면, 다음과 같은 방법으로 유연한 코드 작성을 해 볼 수 있다.
... class Settings_Admin{ ... void FindLine(~) {...} ... } class Settings_User : public Settings_Admin{ ... void FindLine(~) {...} ... } ... int main(){ ... Settings_User test_u, *test_u_ptr; Settings_Admin *test_a_ptr; test_u_ptr = &test_u; test_u_ptr -> FindLine(~); // .1 test_a_ptr = test_u_ptr; test_a_ptr -> FindLine(); // .2 ... }
.1 에선 파생 클래스의 멤버 함수가 호출되고, .2 에선 기본 클래스의 멤버 함수가 호출된다. 이는 포인터에 대해 두 클래스가 다르게 선언되어서 그런 것이다.
오버라이딩은 함수 재정의와는 다른, 구분이 필요한 개념이다. 위 코드로 오버라이딩의 예시를 보면 아래와 같다.
... class Settings_Admin{ ... virtual void FindLine(~) {...} ... } class Settings_User : public Settings_Admin{ ... virtual void FindLine(~) {...} ... } ... int main(){ ... Settings_User test_u, *test_u_ptr; Settings_Admin *test_a_ptr; test_u_ptr = &test_u; test_u_ptr -> FindLine(~); // .1 test_a_ptr = test_u_ptr; test_a_ptr -> FindLine(); // .2 ... }
오버라이딩을 사용하게 되면 .1 과 .2 모두 파생 클래스의 멤버 함수가 호출된다. 기본 클래스의 멤버 함수가 동적 바인딩되어 파생 클래스의 멤버 함수가 실행되는 것이다. *동적 바인딩은 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 발생.
상속이 필요한데, 하필 기본 클래스의 멤버 함수와 파생 클래스의 멤버 함수의 이름이 같아야 한다면, 또는 파생 클래스에서 기본 클래스와 동일한 형식의 함수를 재정의해야 한다면, 다음과 같은 방법으로 유연한 코드 작성을 해 볼 수 있다.
.1 에선 파생 클래스의 멤버 함수가 호출되고, .2 에선 기본 클래스의 멤버 함수가 호출된다. 이는 포인터에 대해 두 클래스가 다르게 선언되어서 그런 것이다.
오버라이딩은 함수 재정의와는 다른, 구분이 필요한 개념이다. 위 코드로 오버라이딩의 예시를 보면 아래와 같다.
오버라이딩을 사용하게 되면 .1 과 .2 모두 파생 클래스의 멤버 함수가 호출된다. 기본 클래스의 멤버 함수가 동적 바인딩되어 파생 클래스의 멤버 함수가 실행되는 것이다. *동적 바인딩은 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 발생.