전체 글
std::function 이란?
C에서는 함수 포인터/ 콜백 함수라는 것으로 많이 배웠습니다. 이해가 잘 안가고, 매 번 볼 때마다 공부하는 것 같다.... std::function, std::bind를 배우고 나서 진짜 함수 포인터가 쉬워졌습니다. 그러나 사람은 매 번 똑같은 실수를 하지.. stackoverflow에서 사용법만 복붙해서 사용하고 있었습니다. 이런 개발자가 되어서는 안됩니다. std::function을 제대로 공부하려고, 해당 블로그를 작성합니다. 잘못된 내용이 있을 수 있으니, 꼭 다른 블로그와 교차 검증을 하셔야 합니다. std::function 이란? 클래스 템플릿 std::function 은 범용 다형 wrapper 함수입니다. std::function 의 인스턴스는 복사 생성 및 호출 대상 (함수, 람다, 바..
항목 36: 상속 받은 비가상 함수를 파생 클래스에서 재정의하는 것은 금물!
- 비가상함수는 정적 바인딩 - 가상함수는 동적 바인딩 - 상속받은 비가상 함수를 재정의하는 일은 절대로 하지 맙시다.
항목 35: 가상함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자
- 비가상 인터페이스 관용구를 통한 템플릿 메서드 패턴 - 가상 함수는 반드시 private 멤버로 두어야한다. - 사용자로 하여금 public 비가상 멤버 함수를 통해 private 가상 함수를 간접적으로 호출하게 만드는 방법 - 함수 포인터로 구현한 전략 패턴 - std::function - 고전적인 전략 패턴 - 한 쪽 클래스 계통에 속해 있는 가상 함수를 다른 쪽 계통에 있는 가상 함수로 대체
항목 34: 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자
- 순수가상함수를 선언하는 목적은 파생 클래스에게 함수의 "인터페이스"만을 물려주려는 것 - 단순 가상함수를 선언하는 목적은 파생 클래스로 하여금 함수 인터페이스뿐만 아니라 그 함수의 기본 구현도 물려받게 하자는 것 - 비가상함수를 선언하는 목적은 파생클래스가 함수 인터페이스와 더불어 그 함수의 필수적인 구현을 물려 받게 하는 것 - 결정적인 실수 두 가지를 피하자 - 모든 멤버 함수를 비가상함수로 선언하는 것을 피하자 - 모든 멤버함수를 가상함수로 선언하는 것을 피하자 - 인터페이스 상속은 구현 상속과 다릅니다. public 상속에서, 파생 클래스는 항상 기본 클래스의 인터페이스를 모두 물려 받습니다.
항목 33: 상속된 이름을 숨기는 일은 피하자
- 어떤 기본 클래스로부터 상속을 받으려고 하는데, 오버로드된 함수가 그 클래스에 들어있고 이 함수들 중 몇 개만 재정의하고 싶다면, 각 이름에 대해 using 선언을 붙여주어야한다. - 파생클래스의 이름은 기본클래스의 이름을 가립니다. - 파생 클래스의 이름은 기본 클래스의 이름을 가립니다. public 상속에서는 이런 이름 가림 현상은 바람직하지 않습니다. - 가려진 이름을 다시 볼 수 있게 하는 방법으로, using 선언 혹은 전달 함수를 쓸 수 있습니다.