가상 함수가 관련되어 있지 않을 때 가상 기본 클래스에서 파생 클래스로 다운 캐스트 할 수 있습니까? 제가 이야기하는 것을 보여줄 수있는 몇 가지 코드가 있습니다 :비 다형성 가상 기본 클래스에서 다운 캐스트하는 방법은 무엇입니까?
struct Base1
{
int data;
};
struct Base2
{
char odd_size[9];
};
struct ViBase
{
double value;
};
struct MostDerived : Base1, Base2, virtual ViBase
{
bool ok;
};
void foo(ViBase &v)
{
MostDerived &md = somehow_cast<MostDerived&>(v); //but HOW?
md.ok = true;
}
int main()
{
MostDerived md;
foo(md);
}
코드는 데모 용입니다. 제 실제 시나리오는 상당히 복잡하며 템플릿 매개 변수와 캐스팅을 포함하고 있습니다. 첫 번째 매개 변수는 두 번째 매개 변수의 기본 매개 변수입니다. 그것은 정상 또는 가상베이스가 될 수 있으며 가상 기능이 있거나 없을 수 있습니다. (하단의 단순화 된 예 참조). 유형 특성을 사용하여 다형성 케이스와 가상/비 가상 기본 케이스를 감지하고 비 다형성 가상베이스를 제외한 모든 것을 해결할 수 있습니다. 그래서 그것이 제가 요구하는 것입니다.
정말 캐스트 할 수있는 방법을 생각할 수 없다:
암시 적 변환이 바로 밖으로을; 이들은 단지 업 캐스트를합니다.
static_cast
명시 적으로 가상 기본 클래스에서 주조 금지 :5.2.9/2 ... 그리고
B
는D
의 가상 기본 클래스와 가상의 기본 클래스도 아니다 기본 클래스는D
입니다. ...dynamic_cast
는 다운 캐스트가5.2.7/6 그렇지 않으면 다형성 클래스를 필요로
v
는 포인터 또는의 glvalue한다, 하나 그것을 할 수 없습니다 다형성 유형 (10.3).10.3/1 ... 가상 함수를 선언하거나 상속하는 클래스를 다형 클래스라고합니다.
reinterpret_cast
이 전혀 적용되지 않습니다.
MostDerived
경우 이것은 물론
dynamic_cast
해결 될 수있는, 적어도 하나 개의 가상 함수를했다. 그러나 그렇지 않다면 캐스트를 할 수있는 방법이 있습니까?
너무 많은 위의 예제 코드에 초점 의견에 비추어
, 여기 내 실제 상황이 무엇인지의 스케치입니다 (모든 인용 부호는 C++ 11 초안 N3485에서 발췌 한 참고) 이다
template <class T_MostDerived>
struct Bar
{
template <class T_Base>
void foo(T_Base &b, typename std::enable_if<std::is_base_of<T_Base, T_MostDerived>::value>::type * = nullptr)
{
T_MostDerived &md = somehow_cast<T_MostDerived>(b);
do_stuff_with(md);
}
};
, 나는 T_Base
는 T_MostDerived
의 기본 클래스는 것을 알고 (내가 T_MostDerived
정말 가장 파생 형 것을 알고),하지만 난 그들에 대해 아무 것도 모른다; Bar
은 알 수없는 클라이언트가 사용할 수있는 라이브러리의 일부인 내 코드입니다.나는 을이 아닌 다형성 가상베이스라고 탐지 할 수는 있지만, 을 그런 경우에 캐스트 할 수는 없습니다.
정확히'ViBase' 다형성을 만들 수없는 이유는 무엇입니까? (예 : 소멸자를 가상으로 만들 수 있음) – pyon
ViBase가 다형성이 아닌 경우 가상 기본 클래스로 사용하는 이유는 무엇입니까? – Niall
'virtual' 키워드를 제거하십시오. 그럼 당신은 지금 일반 structs 다루고있는 참조/포인터를 행복하게 reinterpret ... – Anonymous