Frage

Hier ist mein Code -

#include<iostream>
using namespace std;

class base
{
public:
    void sid()
    {
    }  
};

class derived : private base
{
public:
    void sid()
    {
    }
};

int main()
{
    base * ptr;
    ptr = new derived; // error: 'base' is an inaccessible base of 'derived'
    ptr->sid();
    return 0;
}

Dies ergibt eine Kompilierung Fehler.

error: 'base' is an inaccessible base of 'derived'

Da die Compiler versuchen, die Basisklasse sid() nennen, warum bekomme ich diesen Fehler? Kann dies jemand bitte erklären.

War es hilfreich?

Lösung

11,2 $ / 4 Staaten -

Eine Basisklasse B N ist zugängliche R, wenn

  • ein erfundenes öffentliches Mitglied der B ein öffentliches Mitglied der N wäre, oder
  • R tritt in einem Mitglied oder einen Freund der Klasse N und eine erfundene Öffentlichkeit Mitglied von B würde eine private oder geschütztes Mitglied von N, oder
  • R tritt in einem Mitglied oder Freund einer Klasse P abgeleitet von N, und einem erfunden öffentliches Mitglied der B wäre eine sein privates oder protected Mitglied von P oder
  • gibt es eine Klasse, S, dass B eine Basisklasse von S zugänglich R und S ist eine Basisklasse von N zugänglich bei R ".

Hier 'B' ist 'Basis', 'N' ist 'Abgeleitet' und 'R' Haupt.

  1. Betrachten wir die zweite kugel- ‚R tritt in einem Mitglied oder Freund einer Klasse N, ...‘. Diese Klausel nicht als ‚R‘ (Haupt-) gilt weder Mitglied noch Freund von ‚N‘ (Abgeleitete)

  2. Betrachten Sie die 3. kugel- ‚R tritt in einem Mitglied oder Freund einer Klasse P ....‘. Dieser Mann gilt auch nicht aus den gleichen Gründen wie oben

  3. Sie sich das 4. kugel- Wieder einmal diese Klausel gilt nicht

So können wir schließen, dass ‚Base‘ ist nicht zugänglich Klasse von ‚Abgeleitet‘.

11,2 $ / 5 Staaten -

Wenn eine Basisklasse zugänglich, kann man implizit konvertieren ein Zeiger auf eine abgeleitete Klasse eine Zeiger auf die Basisklasse (4,10, 4.11). [Anmerkung: folgt, dass Mitglieder und Freunde einer Klasse X Dose implizit eine X * auf einen Zeiger umwandeln zu einem privaten oder sofort geschützt Basisklasse von X. -Ende note]

Da Base nicht zugänglich Klasse von Derived ist, wenn in main zugegriffen wird, ist die Standard-Konvertierung von abgeleiteten Klasse Basisklasse schlecht ausgebildet. Daraus ergibt sich die Fehler.

EDIT 2:

Studieren Sie die Fehlermeldungen von einigen populären Compiler und das sollte Ihnen ein besseres Verständnis erhalten helfen. Beachten Sie, wie das Wort ‚unzugänglich‘ erscheint so häufig und konsequent über alle Fehlermeldungen

Die Referenzen sind aus dem Normentwurf N3000. Ich bin noch den letzten Entwurf zum Download:)

GCC prog.cpp: In der Funktion ‚int main ()‘: prog.cpp: 27: Fehler:‚Basis‘ist eine unzugängliche Basis von ‚abgeleitet‘

Comeau Online "ComeauTest.c", Zeile 26: Fehler: Umwandlung in unzugänglicher Basis Klasse „Basis“ ist nicht erlaubt ptr = new abgeleitet;

VS2010 Fehler C2243: 'type cast': Umwandlung von ‚abgeleitet *‘ auf ‚Basis *‘Existiert, ist aber unzugänglich

Andere Tipps

Ich vermute, dass das Problem ist, dass Sie nicht einen abgeleiteten Zeiger auf einen Basiszeiger umwandeln können, wie die Vererbung privat ist.

Chusbad eine eingehende Erklärung vorgesehen, um die Standard-Beteiligung, ich werde versuchen, eine zugängliche Erklärung zu liefern.

In C ++ gibt es 3 Zugriffsebene Bezeich: public, protected und private. Diejenigen, sollen bestimmen, wer Methoden, Attribute oder Basisklassen zugreifen können. Es ist typisch bei der objektorientierten Sprachen.

Hier wählte man private Erbe. Konzeptionell bedeutet dies, dass Sie die Tatsache verschleiern suchen, dass Derived erbt von Base für Außenstehende, die in der Regel bedeutet dies, ist ein Implementierungsdetails.

Als Folge ist die „äußere“ nicht bewusst dieser Beziehung. Dies wird durch den Compiler mit dieser inaccessible Nachricht erzwungen.

Aus gestalterischen Sicht private Vererbung ist im Allgemeinen nicht erforderlich. Entweder die Liskov Substitutionsprinzip gilt und Sie public Vererbung, entweder es ist ein Implementierungsdetail und Sie verwenden Zusammensetzung.

Sie wissen, dass class derived erbt von class base, aber die main() Funktion kennt es nicht. Der Grund für die main() Funktion es nicht weiß ist, dass Sie PRIVAT von class derived class base vererben gefertigt.

Deshalb, wenn Sie assign new derived zu ptr versuchen, sind die Zeigertypen nicht kompatibel sind.

Versuchen Sie diese:

#include<iostream>
#include<conio.h>
using namespace std;

class base
{
      private:
      public:
          virtual void sid() // You might want to declare sid virtual
             {
                  cout<<"base";
             } 
          virtual ~base() // You then probably need a virtual destructor as well.
             {
             } 
};

class derived : public base //public inheritance
{
      private:
      public:
             void sid()
             {
                  cout<<"derived";
             }
};

int main()
{
    base * ptr;
    ptr = new derived;
    ptr->sid();
    getch();
    return 0;
}

das gibt Fehler C2243: 'type cast': Konvertierung von 'abgeleitet *' bis 'base *' existiert, ist aber nicht zugänglich Diese abgeleitete Klasse wurde privat .so Basisklasse Objekt geerbt wird nicht erstellt wird, wenn derieved get Schöpfung geschieht. die derive Objekt zuerst Anrufe zu erstellen geht das Basisklasse-Objekt zu erstellen, die nicht passiert. soltuion ist die Klasse öffentlich abzuleiten. es spielt keine Rolle, ob Ihr Schlüsselwort virtual mit Member-Funktionen verwenden oder nicht.

Sie benötigen sid () Funktion in der Basisklasse als virtuell zu erklären. Eine virtuelle Funktion kann durch eine abgeleitete Klasse ersetzt werden. Andernfalls würden Sie wahrscheinlich einen Compiler-Fehler erhalten.

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