생성자 상속과 다중 상속
다중 상속과 관련된 제약사항
여러 베이스 클래스에서 매개변수 목록이 독같은 생성자는 상속할 수 없다.<- 어느 부모에 있는 것을 호출할지 알 수 없음
10.6.4 메서드 오버라이딩의 특수한 경우
1. 베이스 클래스가 satic인 경우
- C++에서는 static 메서드를 오버라이드 할 수 없음. 메서드에 static과 virtual을 동시에 지정할 수 없다.
2. 베이스 클래스 메서드가 오버로드된 경우
베이스 클래스에 다양한 버전으로 오버로드된 메서드가 여러 개 있는데 그중 한 버전만 오버라이드하면 컴파일러가 베이스 클래스에 있는 다른 버전의 메서드도 함께 가려버림
- 실제 오버라이드하고 싶은 버전은 하나인데 그거 사용하려고 모든 버전을 오버라이드하는것은 너무 불편.
이럴땐 using 키워드를 사용해서 간편하게 처리 가능
3.private 메서드도 얼마든지 오버라이드할 수 있다.
4. 파생 클래스와 베이스 클래스에서 지정한 티폴트 인수가 서로 다를 수 있다. 하지만 실행할 때 적용되는 인수의 타입은 실제 내부에 있는 객체가 아닌 변수에 대해 선언된 타입에 따라 결정됨
5. 베이스 클래스 메서드와 접근 범위를 다르게 지정하는 경우
- 메서드를 오버라이드할 때 접근 권한을 넓히거나 좁힐 수 있다.
10.6.5 파생 클래스의 복제 생성자와 대입 연산자
클래스에서 동적할당 메모리를 사용한다면 복제 생성자와 대입 연산자를 제공하는 것이 바람직함
파생 클래스에서 복제 생성자를 명시적으로 정의하면 반드시 부모클래스의 복제 생성자를 호출해야 함
10.6.6 실행 시간 타입 정보 RTTI
10.6.7 비 public 클래스 상속
클래스를 public이 아닌 권한으로 상속하는 경우는 매우 드물다. 이래야 할 경우 구조가 잘못 설계되어있지는 않은지 다시 생각해볼 것
10.6.8 가상 베이스 클래스
여러 부모가 동일한 클래스를 상속할 때 발생하는 모호함. 이는 공통 부모 클래스에 자체 기능을 정의하지 않으면 해결됨
하지만 모호함이 발생하지 않으면서 자체 기능을 제공할 수 있도록 가상 베이스 클래스라는 기능이 있음
이러면 걍 모호함이 없어짐
10.7 캐스트
C++에서 지원하는 캐스트
const_cast()
static_cast()
reinterpret_cast()
dynamic_cast()
c++20
bit_cast()
C스타일로 (int) 처럼 캐스트하는것도 물론 사용가능하지만 C++스타일이 더 안전하고 깔끔하다
10.7.1 static_cast()
언어에서 제공하는 명시적 변환을 수행
- 실행시간에 타입 검사를 적용하지 않으므로 주의해서 쓴다
서로 관련이 없는 타입의 포인터끼리는 적용불가
변환 생성자가 제공되지 않는 타입의 객체끼리 불가
const 때기 불가
int에 대한 포인터 불가
C++타입 규칙에서 허용하지 않는건 다 불가
10.7.2 reinterpret_cast()
static_cat보다 강력하지만 안정성이 떨어짐
C++타입 규칙에서 허용하지 않더라도 상황에 따라 적합하다면 캐스트
예) 어떤 객체의 포인터를 void*로 캐스트한 후 다시 원래 타입으로 캐스트하려면 이거 써야됨
C++20
10.7.3 bit_cast()
표준 라이브러리에 속한 유일한 캐스트. 다른것들은 C++언어의 일부
주어진 타깃 타입으로 객체를 새로 만들어서 원본 객체에 잇는 비트를 새 객체로 복제함
원본 객체와 대상 객체의 크기가 서로 같으며 쉽게 복제할 수 있는 타입이여야 함
쉽게 복제할 수 있는 타입 = 객체를 구성하는 바이트를 char 등과 같은 타입의 배열로 복제할 수 있어야 한다는 뜻
10.7.4 dynamic_cast()
상속 계층 내부에서 캐스트에 대한 런타입 검사를 제공한다.
포인터나 레퍼런스를 캐스트할때 이용
캐스트하는 것이 적합하지 않다고 판단하면 널포인터 리턴, 레퍼런스는 bad_cast 익셉션 발생
~587p
'전문가를 위한 C++' 카테고리의 다른 글
2025/03/14 ch.11 C++의 까다롭고 유별난 부분 (0) | 2025.03.14 |
---|---|
ch. 7, 8, 9 요약정리 (0) | 2025.03.14 |
2025/03/11 ch.10 상속 활용하기 (0) | 2025.03.11 |
2025/03/10 ch.10 상속 활용하기 (0) | 2025.03.10 |
2025/03/08 ch.09 클래스와 객체 완전 정복 (0) | 2025.03.08 |