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?

questionAnswers(6)

yourAnswerToTheQuestion