Konvertieren von Abgeleitet ** zu Basis ** und Abgeleitet * zu Basis *

Ok, ich habe durchgelesendieser Eintrag in der FQA Umgang mit der Frage der Konvertierung aDerived** zu einemBase** und warum ist es verboten, und ich habe festgestellt, dass das problem ist, dass man a zuordnen könnteBase* etwas was nicht aDerived*, also verbieten wir das.

So weit, ist es gut.

Aber warum verbieten wir ein solches Beispiel nicht, wenn wir dieses Prinzip eingehend anwenden?

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

I stimme zunasty_function macht etwas idiotisches, also könnten wir sagen, dass es in Ordnung ist, diese Art der Konvertierung zuzulassen, weil wir interessante Designs ermöglichen, aber wir könnten das auch für die doppelte Indirektion sagen: Sie haben eineBase **, aber du solltest seiner Ehrerbietung nichts zuweisen, weil du wirklich nicht weißt, wo das istBase ** kommt, genau wie dieBase *.

Die Frage: Was ist das Besondere an dieser zusätzlichen Indirektionsebene? Vielleicht ist der Punkt, dass wir mit nur einer Ebene der Indirektion mit virtuellen spielen könntenoperator= um dies zu vermeiden, obwohl die gleiche Maschinerie nicht für einfache Zeiger verfügbar ist?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage