Stroustrup의 새 책을 방금 읽었습니다. 22.2.2 절에서는 dynamic_cast 문제에 대해 설명합니다.모호한 대상 클래스가있는 Dynamic_cast
I는 다음과 같이 자신이이 문제를 테스트하기 위해 작성한 코드 :
class Storable
{
public:
int i;
virtual void r() {};
Storable()
{
i = 1;
};
};
class Component:public virtual Storable
{
public:
Component()
{
i = 1;
};
};
class Receiver:public Component
{
public:
Receiver()
{
i = 2;
};
};
class Transmitter:public Component
{
public:
Transmitter()
{
i = 3;
};
};
class Radio:public Transmitter
{
public:
Radio()
{
i = 4;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Radio *r = new Radio();
Storable *s1 = dynamic_cast<Storable*>(r);
Component *c = dynamic_cast<Component*>(s1); // this should be 0 but it is not!
return 0;
}
Stroostrup는 언급되고 저장 가능한 버전을 알 수없는 것처럼 C는 nullptr해야한다고 설명한다. 그러나, 나는 그것을 유효한 포인터로 얻는다.
나는 Stroustrup이 아마 이것에 맞을 것이라고 추측 하겠지만 미묘하게 내가 놓친 것을 볼 수 없다.
"class Component : public virtual Storable"- 여기에서 가상 키워드를 제거하고 어떤 일이 일어나는지보십시오 (http://en.wikipedia.org/wiki/Virtual_inheritance). –
@ MateuszKołodziejski 아직도 아무것도 - OP의 예제는 순전히 선형의 단일 상속 계층 구조입니다. – Angew
@Mateusz, 각 구성 요소마다 고유 한 저장 가능하므로 잘 작동합니다. 이 문제는 dynamic_cast에 대한 두 구성 요소의 공유 저장 용량이 있다는 것을 알고 있기 때문에 어느 것을 사용해야할지 모르며 nulptr을 반환합니다. – Stefan