Konwertowanie pochodnej ** na bazową ** i pochodną * na bazę *
Ok, czytałemten wpis w FQA radzenie sobie z problemem konwersjiDerived**
do aBase**
i dlaczego jest to zabronione, a ja zrozumiałem, że problem polega na tym, że można przypisać doBase*
coś, co nie jestDerived*
, więc zabraniamy tego.
Jak na razie dobrze.
Ale jeśli zastosujemy tę zasadę dogłębnie, dlaczego nie zabraniamy takiego przykładu?
void nasty_function(Base *b)
{
*b = Base(3); // Ouch!
}
int main(int argc, char **argv)
{
Derived *d = new Derived;
nasty_function(d); // Ooops, now *d points to a Base. What would happen now?
}
Zgadzam się z tymnasty_function
robi coś idiotycznego, więc możemy powiedzieć, że pozwolenie na tego rodzaju konwersję jest w porządku, ponieważ umożliwiamy ciekawe projekty, ale możemy powiedzieć, że również w przypadku podwójnego kierunku: maszBase **
, ale nie powinieneś przypisywać niczego do jego szacunku, ponieważ tak naprawdę nie wiesz, gdzie to jestBase **
przychodzi, podobnie jakBase *
.
Tak więc pytanie: co jest specjalnego w tym dodatkowym poziomie orientacji? Może chodzi o to, że z jednym poziomem orientacji możemy grać wirtualnieoperator=
aby tego uniknąć, podczas gdy ta sama maszyna nie jest dostępna na zwykłych wskaźnikach?