Edytuj - Umieść pytanie w kontekście nieco więcej.rzut Pochodny * const do Bazy * const
Dane:
struct Base
{
...
};
struct Derived : public Base
{
...
};
class Alice
{
Alice(Base *const _a);
...
};
class Bob : public Alice
{
Bob(Derived *const _a);
...
};
Kiedy próbuję wdrożyć
Bob::Bob(Derived *const _d) : Alice(static_cast<Base*const>(_d)) { }
to nie działa. const_cast
nie ma sensu do mnie jak nie chcę, aby zmienić constness, a ja nie zmienia, co mam wskazując, więc dlaczego wtedy nie g ++ mi
invalid static_cast from type ‘Derived* const’ to type ‘Base* const’
? Jeśli pominię rzutowanie, będzie to oznaczać, że ktoś może rzucić na to jakiekolwiek światło. Byłoby to bardzo doceniane.
Jeśli 'Derived' ma faktycznie' Bazę' jako klasę podstawową, to (a) ten kod nie powinien powodować żadnych błędów (może to spowodować ostrzeżenie, że kwalifikator const dla 'static_cast' target nic nie robi) i (b) możesz po prostu przypisać '_derived_ptr' do' _base_ptr' zgodnie z sugestią Oli. –
Myślę, że masz const po niewłaściwej stronie: 'Base * const x;' Tutaj x jest wskaźnikiem const dla 'standardowej bazy' (tzn. Nie można zmienić x). 'Base const * x' Tutaj x jest wskaźnikiem do' const Base' (tzn. Obiekt wskazywany przez x jest const). –
Rzeczywiście mam wskaźniki jako const, a nie obiekty wskazane. Ponadto, to pytanie nie jest całkowicie poprawne (tylko po to, aby powstrzymać mnie przed zalaniem pytania kodem), ponieważ używam statycznego rzutowania w konstruktorze wywołującym jego konstruktor macierzysty: 'SomeClass :: SomeClass (Derived * const _d): SomeBase (static_cast (_d)) {} ' –
parallel