Frage

Ich habe eine Frage basierend auf Dies Frage

Im Bereichhttp://www.parashift.com/c%2b%2b-faq-lite/private-inheritance.html#faq-24.3Das Folgende wird erwähnt:

Eine legitime, langfristige Verwendung für das private Erbe ist, wenn Sie einen Klassen-Fred erstellen möchten, der Code in einer Klasse Wilma verwendet, und der Code aus der Klasse Wilma muss Mitgliederfunktionen aus Ihrer neuen Klasse Fred aufrufen. In diesem Fall ruft Fred in Wilma und Wilma-Aufrufe (normalerweise reine Virtuale) an sich, die von Fred außer Kraft gesetzt werden. Dies wäre viel schwieriger mit Komposition zu tun.

Ich möchte jedoch wissen, warum die Verwendung der öffentlichen Erbschaft nicht den gleichen Effekt erzielen würde. dh das folgende Stück C# Code macht dasselbe.

class Wilma
{
    protected void FredCallsWilma() {
        Console.Write("Fred Calls Wilma ;");
        WilmaCallsFred();
    }

    protected virtual void WilmaCallsFred() {}
}

class Fred : Wilma
{
    public void barney(){
        Console.Write("barney;");
        FredCallsWilma();
    }

    protected override void WilmaCallsFred(){
        Console.Write("Wilma Calls Fred ;");
    }
}

class Program
{
    static void Main(string[] args){
        Fred f1 = new Fred();
        f1.barney();
    }
}

Es druckt

Barney; Fred ruft Wilma an; Wilma nennt Fred

Was ist also das Besondere an der privaten Erbschaft, wie in der C ++ - FAQ Lite zitiert. Würde die öffentliche Erbschaft nicht durch die private Erbschaft ersetzt, um dieses Ergebnis zu erzielen?

War es hilfreich?

Lösung

Die öffentliche Erbschaft macht die Basisklasse für die Außenwelt zugänglich. Beispielsweise kann ein Zeiger auf die abgeleitete Klasse (implizit, nicht weniger) in einen Zeiger auf die Basisklasse konvertiert werden. Betrachten Sie einen Stapel, der aus einer verknüpften Liste stammt. Im Allgemeinen möchten Sie nicht, dass jemand Ihr Array implizit in seine linde linde Liste konvertiert, wodurch er Dinge tun kann, die für einen Stapel nicht zulässig sind, z. B. das Einfügen oder Löschen von Elementen in der Mitte.

Die übliche Bedeutung, die dem privaten Erbe zugeschrieben wird, wird "in Bezug auf" implementiert - was bedeutet, dass wir der Außenwelt/dem Benutzer normalerweise nicht erlauben möchten, die Tatsache zu sehen/zu wissen/zu wissen, dass diese Klasse eine Basisklasse hat. Die öffentliche Vererbung sollte der Liskov -Substitutionsregel folgen, die besagt, dass eine abgeleitete Klasse überall dort ersetzt werden kann, wo eine öffentliche Basisklasse aufgefordert wird. Mit privatem Erbe sagen wir ausdrücklich nicht, dass die abgeleitete Klasse für die Basisklasse ersetzt werden kann.

Die öffentliche Erbe ist eine Designtechnik. Seine Absicht ist es, dem Code, den Sie schreiben, von einem anderen Code verwendet zu werden, der bereits weiß, wie sie mit der von der Basisklasse präsentierten Schnittstelle arbeiten.

Privatvererbung ist eine Implementierungstechnik. Seine Absicht ist nur die Vereinfachung Ihrer Implementierung durch die Verwendung von Code aus der Basisklasse.

Andere Tipps

Ja du hast Recht. Der zitierte Absatz zitiert nur, dass Kinderklassen Zugang zu privaten Mitgliedern von erbsen Klassen haben, und einen möglichen Anwendungsfall dafür.

Einige Leute gehen fälschlicherweise davon aus, dass Sie nicht auf private Mitglieder ererbter Klassen zugreifen können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top