2012-07-05 3 views
1

나는 기본 클래스 (honda)를 상속 기본 클래스 (car)와 클래스가 :파생 클래스를 올바르게 캐스팅하는 방법은 무엇입니까?

class car 
{ 
    virtual void polymorphic_class() 
    { } 
}; 

class honda : public car 
{ }; 


나는 다음과 같은 코드를 사용하고 난 널 포인터를 얻을 내 수업을 시전 할 때 :

list<car> cars; 
honda h; 
cars.push_back(h); 
honda* h_ptr = dynamic_cast<honda*>(&cars.back()); 
// h_ptr is NULL 

왜? 어떻게하면 물건을 제대로 캐스팅해야합니까?

+1

정확하게 캐스팅 할 방법이 없습니다. 귀하의 목록은'자동차'목록입니다. 그것은 '혼다 (honda)'를 포함하지 않는다. –

답변

2

다형성은 객체 인스턴스가 아니라 포인터와 참조에서 작동합니다.

이 경우 목록에는 파생 형식이 아닌 car 유형의 개체가 포함되어 있습니다. honda을 삽입하면 car 부분이 복사되고 나머지 부분은 무시됩니다. 이것은 때로 슬라이스이라고도합니다.

list<car*> cars {new honda}; 
honda * h_ptr = dynamic_cast<honda*>(cars.back()); // should be a valid pointer 

참고 :

다형성를 들어, 포인터의 목록을 사용할 수 있습니다 당신이 내 예제와 같이 new를 사용하여 할당 할 경우, (같은 std::unique_ptr<car>) 대신에 하나 delete 그들을 기억, 또는 스마트 포인터를 저장 원시 포인터보다. 기본 클래스 포인터를 사용하여 객체를 삭제하려면 가상 소멸자가 필요합니다.

기본 클래스를 추상화하여 슬라이스 문제를 피할 수 있습니다.; 이 순수 가상 함수를 포함하는 경우, 당신은 그 기능을 오버라이드 (override)에만 파생 된 형식의 해당 유형의 객체 인스턴스화 할 수 없습니다 : 당신이 실제로 추상적 인 인터페이스를하지 않으려면

class car 
{ 
    virtual ~car() {} 
    virtual void do_something() = 0; 
}; 

class honda : public car 
{ 
    void do_something() {} 
}; 

(예를 만 액세스하는 경우 가상 함수 대신 dynamic_cast을 사용하여 파생 클래스 기능을 사용하는 경우) 소멸자를 순수 가상으로 만들 수 있습니다. 파생 클래스는 명시 적으로 아무 것도 재정의 할 필요가 없습니다. 가상 함수를 통해 다형성은 일반적으로 더 효율적이기 때문에, 이것은 다소 특이한 방식이다

class car 
{ 
    virtual ~car() = 0; 
}; 
inline car::~car() {} 

class honda : public car {}; 

: 기본 클래스 소멸자는 여전히 구현 클래스 정의 외부에 있어야한다는 인해 언어의 특질에 구현되어야합니다 그리고 더 편리합니다.

4

이유가 작동하지 않는 이유는 개체 조각화입니다. cars의 개체는 더 이상 honda s가 아니며 자동차 일뿐입니다.

list<car*> cars; 
honda h; 
cars.push_back(&h); 
honda* h_ptr = dynamic_cast<honda*>(cars.back()); 

실제로 디자인을 변경하고 car 추상 (순수 가상 소멸자 또는 뭔가를) 할 것 :

당신은 포인터 또는 스마트 포인터의 벡터가 필요합니다. 그렇게하면 컴파일 오류가 발생합니다.

+0

어쨌든 내 코드에 컴파일 오류가 없습니다. – Nick

+3

@ 닉하지만 당신은 하나 싶지 않아? –

+0

@ 닉 나는 당신이 지금 하나를 얻지 못한다는 것을 알고 있지만, 만약 당신이 가지고 있다면,이 문제를 일찍 발견 할 수있다. –

0

이 작동이

list<car*> cars; 
honda *h = new honda(); 
cars.push_back(h); 
honda* h_ptr = dynamic_cast<honda*>(cars.back()); 

을보십시오.

관련 문제