reference로 받아들였으니, 정상적으로 derived의 객체로 출력되고 있다.
하지만 ref가 아닌, 그냥 value로 받아버리면, 값을 복사하는 것이기 때문에
Base가 Derived 보다 크기가 작으므로 Derived의 차집합 부분이 짤림이 발생한다.
그렇기에, 오버라이딩이 되지 않은 채 Base가 출력되버린다.
doSomething 함수를 보면 얘도 인자로 엄연히 reference로 받고 있기 때문에, Derived에 맞게 출력된다.
하지만 value로 받게 되면? 아까처럼 Base로 출력된다.
이건 유의점인데, vector를 활용할 경우 vector에선 &, 즉 reference를 활용할 수 없다.
그렇기에 단순히 vector<Base>로 할 경우 아까처럼 value로 처리되기 때문에 잘림현상이 발생한다.
초보일 때 많이 실수함.
그럼 어떻게 해야할까? 첫번째로는 포인터로 받아주면은, 해결된다.
하지만 굳이 참조를 활용하고 싶다면 ?
functional이라는 헤더파일을 활용할 수 있다. reference_wrapper<>로 인자를 ref로 바꾸는 것이다.
주의할점은 값을 de-ref할 때 get()함수를 써야한다는 것?
상식적으로 생각해보자.
Base* base = &d1을 한 후에, base에서 d1의 멤버들을 접근할 수 있을까?
생각해보면 부모의 포인터인데 자식의 멤버들을 접근하는 건 불가하다. 하지만 자식의 주소값을 줬기 때문에 가능할 듯 싶기도 하고..
방법은, 임시로 Base* base를 Derived1* 로 바꾸면 되는 것이다.
static_cast, dynamic_cast 는 다음 글에서 더 자세히 다뤄보겠다.
friend 함수의 경우, 엄연히 말하면 클래스 내의 멤버 함수가 아니기 때문에, 오버라이딩을 할 수 없다.
그렇기에 약간 우회해서 사용을 하는데.
이 형태는 자주 쓰니 자주 보고 암기해보자.
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 13-(2). 템플릿 Template (template<> specialization) (0) | 2021.11.09 |
---|---|
Chapter 13 - (1). 템플릿 Template (0) | 2021.11.07 |
Chapter 12-7, 8. 순수 가상 함수, 추상 기본 클래스, 인터페이스 클래스, 다이아상속문제 (0) | 2021.11.03 |
Chapter 12-1~6. 가상 함수들(virtual) (21.11.2) (0) | 2021.11.02 |
chapter 11. 상속 (0) | 2021.11.01 |