1장)
각자의 클래스에 speak()함수를 구현했기에, 각자에 맞게 호출되는 모습이다.
하지만, 상속이라는 개념을 사용하는 것 자체가 편리하기 때문에 사용하는 것일텐데.
Animal* ptr_animal1 = &cat;을 한다면, 자료형 자체는 Animal*이기 때문에, Animal클래스로 해석해버려서
???가 나온다. 우리가 원하는 방향이 아닌데, 이럴 땐 어떻게 해야하나.
해결책은 부모와 자식의 클래스가 같은 경우, 오버라이딩을 하고 싶은 함수에 virtual을 부모클래스 있는 곳에 선언해주면 된다.
2장)
자료형이 A이기 때문에, "A"가 출력된다.
우리가 원하는 건, B가 프린트되는 것이기에, A의 함수에 virtual을 선언함으로써, B의 print()함수가 나올 수 있게 되었다.
여기서 신기하게 생각해야할 부분이, 상속순서가 A-> B -> C이기 때문에,
A 함수에 virtual을 해줘도, B가 virtual이 아니라, B가 출력될 줄 알았으나, C가 나왔다.
이 말은, 제일 부모의 클래스에 virtual을 해주면 나머지에도 다 virtual로 작동한다는 것이다.
하지만 헷갈리니, 모든 곳에 virtual을 써줌으로써 여기엔 오버라이딩을 할 것이에요라고 알려주는 것이 좋겠지.
3장)
virtual을 써주었음에도, A클래스의 함수가 나온다.
당연하다. A의 print 함수와 B의 print 함수는 인자가 다르기에 다른 함수이다. 그러니 오버라이딩을 할 수 없다.
이럴 경우, 우리의 의도와는 맞지 않으므로, 오버라이딩을 하고 싶은 함수에 뒤에 override를 써줌으로써,
이 함수에 오버라이드를 하고 싶어요를 명시한다. 이걸 통해 오류를 확인가능.
final 키워드는? final을 선언한 함수가 오버라이딩의 마지막 함수라는 것을 명시.
그러면 그 이후의 상속받는 클래스들에서는 해당 함수를 오버라이딩할 수 없다.
하나 추가적으로, getThis()함수의 경우 return type이 엄연히 다르다.(하나는 A*이고, 하나는 B*)
그럼에도 불구하고, 오버라이딩을 한다 (단, 상속관계일 시)
ref.getThis()->print()를 보자.
자료형이 A이니 오버라이딩을 안했다면 A* getThis()로 가야하지만, B* getThis()로 갔다.(단, 둘다 virtual을 선언했으니 오버라이딩이 된거임.)
단, print()함수의 경우 virtual 선언이 안되어있으므로, A의 print()가 오버라이딩 없이 호출된 것이다.
4장)
보통, 소멸자의 순서를 보면
자식 -> 부모 순으로 역순이다.
만약 이러한 코드라면? 자료형이 Base*이므로, Base의 소멸자만 호출되고 종료된다.
그러면 기존의 자식에서 동적할당 된것들이 delete이 안되어서 메모리 leak이 생길 수 있음.
그러면 해결책은? 소멸자에도 virtual로 선언하는 것이다!
5장)
정적 바인딩과 동적 바인딩의 차이이다.
이건 기존의 정적배열, 동적할당을 비교하면서 잘 배운 것이라 생각.
차이점만 강조해보자면, 동적할당이 조금 더 느리지만(주소를 받아와서 해당 주소로 가는 동작이 있으므로)
주소값을 바꿈으로써 조금 더 유연한 프로그래밍이 가능하다.
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 12(가상 함수들) 끝. (0) | 2021.11.06 |
---|---|
Chapter 12-7, 8. 순수 가상 함수, 추상 기본 클래스, 인터페이스 클래스, 다이아상속문제 (0) | 2021.11.03 |
chapter 11. 상속 (0) | 2021.11.01 |
Chapter 10-5. 의존 관계 (0) | 2021.10.31 |
Chapter 10 -4. 제휴 관계(Association relation) (0) | 2021.10.31 |