✅상속 _ 중복 가려지는 문제들. using을 이용한 생성자 상속.

보물창고·2022년 3월 6일
0
  • 업데이트 : 240317
    -> 생성자 상속이 있고, 프로젝트 만들 때 사용하자.

  • 네이버 블로그 참고 : 상속 생성자는 잘 알고 사용하자.
    -> 만약 파생클래스에서 인자로 들어오게 되면, Base 클래스에다가 전달하려면 계속 연이어 생성자 인자로 전달해야 한다.

상속에서의 중복 함수 가려짐.

  • 재정의가 아닌 상태에서 , 파생클래스가 함수이름이 동일할 경우(인자 타입, 반환 타입, 인자 개수등)
    함수 시그니처가 다르다고 하더라도, 기반베이스의 함수는
    파생 클래스 함수에 의해 가려짐.
    - 이펙티브 c++ 36
    -> 상속해서 사용한다는 의미가 만들어진 기능을 그대로 물려받는다는 의미인데, 이름 중복시키는 것을 상속을 파훼하는 행동임
  • 결론
    : 비가상 함수에 대한 이름 중복을 피하자.
    -> 인자가 다르지만, 가리고 있는 것을 확인할 수 있음

  • 아래 코드를 보면, 기반은 int 인자가 있는 foo 함수이고,
    파생 함수는 인자가 없는 foo함수이다.
    따라서 일반적으로 생각하기에는 둘다 사용가능하지 않을까? 생각하지만,
    아래 결과를 보면, int인자가 있는 foo 함수 호출이 불가함을 확인할 수 있다.
    -> 즉 함수를 가리고 있는 것이다.


-> 파생 클래스에서 기반 클래스의 멤버함수 foo의 인자 시그니처를 동일하게 하고, 작성할 경우 이는 재정의(오버라이딩)에 해당함.

-> 파생 클래스에서 인자의 갯수, 인자 타입. 를 다르게 한 상태
이것이 의미하는 바는?

  • 파생 클래스에서 사용되는 함수로 인해 기반 클래스의 foo (인자 한개)인 함수는 가려짐.
    -> 버그를 방지하기 위한 문법
  • 만약 기반 클래스의 foo(int) 함수를 사용하고 싶다면,
    using 키워드로 선언만 하면 됨.
    -> 아래 예시코드를 통해 확인할수 있다.

-> 이런식으로 사용하면 됨.

생성자 상속.

개념

: using을 사용하면 기반 클래스의 생성자도 가려지는 문제를 방지할 수 있다.

예시 코드

  • 상속을 하다 보면 , 초기화하면서 발생하는 점에 대해


-> 파생 클래스에서 기반 클래스의 멤버값을 초기화할 때,
이런식으로 초기화를 했음.
: 파생클래스는 기반 클래스의 데이터를 초기화하기 위해서 이니셜라이저에서 초기화함.

업그레이드! -> 파생 클래스로 기반 클래스의 인자 많은 생성자 구현할까? 생각할 때 , 이런식으로 사용하자.

  • 기반 클래스의 생성자를 상속함으로써 초기화 코드를 없앨 수 있음.

  • 특징으로는 반드시 기반클래스의 생성자는 디폴트값이 있어야 한다.
    없으면 에러 발생함...

  • 디폴트 생성자 처리를 하든지? 아니면 인자 있는 함수에 직접 디폴트값을 넣어주는 방식으로 처리가 가능하다.

    1. 디폴트 생성자를 만들면 해결됨.
    1. 기반 클래스의 생성자의 인자에 디폴트값 채우자.
    1. 그냥 파생도 default로 해보자.
  • 결론
    : 디폴트 생성자 최고!

생성자 가리기도 적용된다.... 240802

  • 특징이 파생클래스의 생성자가 호출되지 않는다....
    즉 기반클래스의 멤버들을 초기화하기 위한 방법일뿐, 파생클래스의 데이터들이 초기화되지는 않는다.
  • 하지만 이때는 기반클래스의 생성자가 호출되지 않았따.

뭐냐?? 이것도 생성자를 가리고 있는 것이다.
: 전문가 c++ p.560에 해당함.

결론 240802

: 생성자 상속을 사용한다고 할 때는 반드시 파생 클래스에서는 파생에서만의 멤버 데이터가 없어야 한다.
그리고 파생 클래스 생성자가 호출되지 않을수도 있다는 것을 알고 있자.

프로젝트 작업시 예시

  • 현재 Player 생성자 코드

  • 파생클래스인 MyPlayer 생성자 만들때 이렇게 사용해왔다

  • 위에서 배운 생성자 상속으로 코드 단순하게 만들어보자.

    1. MyPlayer 지운 다음에 헤더에서 디폴트 생성자 만듦.
    1. 기반 클래스인 Player 클래스에도 그냥 디폴트 생성자 만들어서 처리하자.
      : 빌드하면 이상없음!
profile
🔥🔥🔥

0개의 댓글