로 변환 : 그런데 왜 C++ 스트로브 스트 룹의 책dynamic_cast는 의심 : 나는 코드를 다음은 컴파일 오류가 있습니다 것을 알고 보호 기본 클래스
class A{ public : virtual void name(){cout<<typeid(this).name()<<endl;}; };
class B:protected A{public : virtual void name(){cout<<typeid(this).name()<<endl;};};
void foo(B* b)
{
A * a = dynamic_cast<A*>(b); //Error : 'A' is an inaccessible base of 'B'
return;
}
을 (15.4.1)는 그가
class BB_ival_slider:public Ival_slider,protected BBslider{ //...
};
void f(BB_ival_slider*p)
{
// ok
BBslider* pbb2 = dynamic_cast<BBslider*>(p); // ok: pbb2 becomes 0
}
를 기록
라인이 컴파일 오류가 아니어야합니까? 그래서 내 gcc는 컴파일 오류 또는 생각할 수없는, stroustrup 오타 또는 가장 그럴듯하게 뭔가를 놓친 뭔가를 놓친 뭔가를 놓친 ......... 플래그를 잘못 잘못되었습니다.
재미있는 질문 - 기본이 가상이고 하위 하위 클래스가 '공개 가상'을 통해 동일한 기본에서 파생되는 경우에도 실패합니다 ... 컴파일러가 이것을 거부 할 수있는 이유에 대한 C++ 표준 인용문을보고 싶습니다. – bdonlan
나는 게으르다. :(보통 나는 표준으로 Stroustrup의 말을 따릅니다. :) 그런 활발한 언어에 대해 세상을 가장 건조하고 지루한 표준 보고서를 열 필요가 있다고 생각합니다. –
@bdonlan : 5.2.7 para 5에서는'dynamic_cast (pointer_to_class_D)에 대해서''B'는 ** 접근 가능한 ** 모호하지 않은'D'의 기본 클래스 "(emphasis mine)가 될 것이라고 말했습니다. –