2016-06-20 8 views
0

Quoting SV LRM.계층 구조의 동적 캐스팅

는 상속 트리에서 더 높은 클래스 타입 (식 유형의 슈퍼 클래스 또는 조상)의 변수에 서브 클래스 유형의 식을 지정하는 것이 합법적이다. 서브 클래스 유형 중 하나의 변수에 수퍼 클래스 유형의 변수를 직접 할당하는 것은 불법입니다. 그러나 $ cast는 서브 클래스 유형의 변수에 핸들을 할당하는 데 사용될 수 있습니다. 은 서브 클래스 변수와 지정이 호환되는 객체를 나타냅니다.

수퍼 클래스 인스턴스를 하위 클래스 인스턴스에 할당하려고 할 때 캐스팅이 실패하는 시나리오는 언제입니까? 우리는 서로 호환되지 않는 두 개의 인스턴스를 캐스팅하려고 할 때마다 캐스팅이 실패한다는 것을 이해합니다. 같은 계층 구조의 나무에 속하면 언제든지 주조에 실패할까요? 그렇다면 언제 알 수 있습니까?

답변

3

클래스 인스턴스에 할당하지 마십시오. 클래스 유형을 사용하여 변수에 할당합니다. 구별은 미묘하지만 클래스 유형과 클래스 변수 및 클래스 인스턴스에 적용하는 방법의 차이를 아는 것이 중요합니다.

상황은 LRM은 a_h가 B 형의 클래스 인스턴스에 대한 핸들을 보유하고 있기 때문에 두 번째 $ 캐스트가 실패 할이

class A; endclass 
class B extends A; endclass 
class C extends A; endclass 

A a_h; 
B b_h; 
C c_h; 

b_h = new; 
a_h = b_h; // always legal to go up the inheritance tree 
$cast(b_h, a_h); // $cast required - will succeed 
$cast(c_h, a_h); // $cast required - will fail 

되는 의미와 유형 C의 클래스 변수에 할당하려고 이 코드는 매우 간단하지만 큰 환경에서는 a_h에서 어떤 인스턴스가 보유되고 있는지를 쉽게 알 수 없으며 SystemVerilog는 런타임 검사가 필요합니다.

+0

클래스 캐스팅은 동적 캐스팅으로 만 수행해야합니까? – user1978273

+0

@ user1978273, 아니요. 상향식 주조시 동적 주조를 사용해서는 안됩니다. 다운 캐스팅을 위해 동적 캐스트를 사용해야합니다. –

+0

감사합니다. Dave. 업 캐스트 및 다운 캐스트는 어떻게 정의합니까? 클래스 정의의 계층 구조 또는 스펙을 기반으로합니까? – user1978273