Преобразование производных ** в базу ** и производных * в базу *
Хорошо я читалаэта запись в 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=
чтобы избежать этого, хотя такой же механизм недоступен для простых указателей?