Преобразование производных ** в базу ** и производных * в базу *

Хорошо я читалаэта запись в FQA имея дело с проблемой преобразованияDerived** кBase** и почему это запрещено, и я понял, что проблема в том, что вы можете назначитьBase* то, что не являетсяDerived*поэтому мы запрещаем это.

Все идет нормально.

Но если мы применяем этот принцип в глубине, почему мы не запрещаем такой пример?

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?
}

я согласна с тем чтоnasty_function делает что-то идиотское, поэтому мы могли бы сказать, что допускать такое преобразование - это хорошо, потому что мы разрешаем интересные проекты, но мы можем сказать, что и для двойной косвенности:Base **, но вы не должны связывать что-либо с его почтением, потому что вы действительно не знаете, где этоBase ** приходит, как иBase *.

Итак, вопрос: что особенного в этом дополнительном уровне косвенности? Возможно, дело в том, что, имея всего один уровень косвенности, мы могли бы играть с виртуальнымoperator= чтобы избежать этого, хотя такой же механизм недоступен для простых указателей?

Ответы на вопрос(6)

Ваш ответ на вопрос