static_cast : 컴파일 타임에 형변환 가능한지 확인 후 가능하면 형변환, 불가능시 컴파일 에러.
static_cast에서 컴파일 타임에 오류가 발생하는 주요 규칙 위반
상속 관계가 없는 클래스 간의 포인터 변환
class A {};
class B {};
A* a = new A();
B* b = static_cast<B*>(a); // 오류: A와 B는 상속 관계가 아님
- static_cast는 상속 관계에 있는 클래스들 간의 포인터 변환만 허용합니다. 상속 관계가 없는 두 클래스 간에 포인터 변환을 시도하면 컴파일 오류가 발생합니다.상속 관계가 없는 클래스 간의 포인터 변환:
기본 타입 간의 유효하지 않은 변환:
int i = 10;
double* dp = static_cast<double*>(&i); // 오류: int*에서 double*로 변환 불가
- static_cast는 기본 타입 간의 변환을 허용하지만, 변환이 명확하지 않거나 지원되지 않는 경우에는 컴파일 오류가 발생합니다. 예를 들어, 포인터 타입과 정수형 사이의 변환은 허용되지 않습니다.
다중 상속에서의 모호성 문제:
class Base1 {};
class Base2 {};
class Derived : public Base1, public Base2 {};
Base1* b1 = new Derived();
Derived* d = static_cast<Derived*>(b1); // 오류: 모호한 변환
- 다중 상속의 경우, static_cast를 사용할 때 모호성이 발생할 수 있습니다. 예를 들어, 두 기본 클래스로부터 상속받은 파생 클래스가 있을 때, 기본 클래스의 포인터를 파생 클래스의 포인터로 캐스팅하려고 할 때 모호성이 있다면 컴파일 오류가 발생합니다.
삭제된 형변환 연산자:
class NonConvertible {
public:
operator int() = delete; // int로의 변환을 삭제
};
NonConvertible nc;
int i = static_cast<int>(nc); // 오류: 삭제된 변환
- C++11부터는 클래스에 대해 특정 형변환을 금지시키기 위해 삭제된 변환 함수를 사용할 수 있습니다. 삭제된 형변환 연산자를 사용하는 경우 static_cast로 변환을 시도하면 컴파일 오류가 발생합니다.삭제된 형변환 연산자:
순수 가상 클래스의 인스턴스화 시도:
class Abstract {
public:
virtual void foo() = 0; // 순수 가상 함수
};
class Concrete : public Abstract {
// void foo() override {} // 주석 해제하면 오류가 없음
};
Abstract* abs = new Concrete();
Concrete* con = static_cast<Concrete*>(abs); // 오류: Concrete는 Abstract의 모든 함수를 구현하지 않음
- 추상 클래스(순수 가상 함수가 있는 클래스)의 포인터나 참조를 구체 클래스의 포인터나 참조로 변환하려고 할 때, 구체 클래스가 추상 클래스의 모든 순수 가상 함수를 구현하지 않으면 오류가 발생할 수 있습니다.
'C++' 카테고리의 다른 글
dynamic_cast (0) | 2024.09.05 |
---|---|
참조 타입 (Reference) (0) | 2024.07.07 |
문자 타입 (0) | 2024.07.07 |
부동소수점 (0) | 2024.07.03 |