Когда статическое приведение безопасно при использовании множественного наследования?

Я оказался в ситуации, когда я знаю, к какому типу относится что-то. Тип является одним из трех (или более) уровней наследования. Я вызываю фабрику, которая возвращает B*, однако T - это либо высший уровень типа (если мой код знает, что это такое), либо второй уровень.

В любом случае, я сделал static_cast в шаблоне, что неправильно. Мой вопрос в том, КОГДА я могу безопасно использовать статический каст? Бывает ли такое время? Я сделал это в данном случае, потому что я предпочел бы получать ошибки компиляции, когда я случайно имею T как что-то странное, что (уже произошло и) динамическое приведение игнорирует (и возвращает null). Однако когда я знаю правильный тип, указатель не корректируется, что приводит к тому, что я имею плохой указатель. Я не уверен, почему статическое приведение вообще разрешено в этом случае.

Когда я могу безопасно использовать static_cast для приведения вниз? Бывает ли такая ситуация? Теперь кажется, что всегда неправильно использовать static_cast (когда целью является down cast)

Ok Я понял, как это воспроизвести.

#include <iostream>
struct B { virtual void f1(){} };
struct D1 : B {int a;};
struct D2 : B {int a, b; };
struct DD : D1, D2 {};

int main(){
void* cptr = new DD(); //i pass it through a C interface :(
B*  a = (B*)cptr;
D2* b = static_cast<D2*>(a); //incorrect ptr
D2* c = dynamic_cast<D2*>(a); //correct ptr
std::cout << a << " " <<b << " " <<c;
}
12
задан Null 10 June 2015 в 14:51
поделиться