Odnośnie poniższego program w C++:Konwersja wskaźnika do wskaźnika między klasą pochodną i klasą podstawową?
class Base { };
class Child : public Base { };
int main()
{
// Normal: using child as base is allowed
Child *c = new Child();
Base *b = c;
// Double pointers: apparently can't use Child** as Base**
Child **cc = &c;
Base **bb = cc;
return 0;
}
GCC produkuje następujący błąd na ostatniej instrukcji przypisania:
error: invalid conversion from ‘Child**’ to ‘Base**’
moje pytanie jest na dwie części:
- dlaczego nie ma niejawna konwersja z Child ** do Base **?
- Mogę sprawić, aby ten przykład działał z obsadą w stylu C lub
reinterpret_cast
. Używanie tych odlewów oznacza wyrzucenie wszelkiego rodzaju bezpieczeństwa. Czy jest coś, co mogę dodać do definicji klas, aby te wskaźniki były domyślnie rzucane, lub przynajmniej wyrażały konwersję w sposób, który pozwala mi używać zamiast tegostatic_cast
?
Wariacje na temat tego pytania w wielu językach programowania są jednym z najczęściej zadawanych pytań dotyczących SO. Ale wszyscy określają to nieco inaczej, nawet dla tego samego języka, więc znalezienie duplikatów może być trudne. –
"Naprawianie" tego przykładu, aby uniknąć podejrzanych rzutów, zależy od tego, dlaczego najpierw używasz wskaźnika do wskaźnika. – aschepler