2011-01-05 15 views
6

Da wir Methoden in der Basisklasse überladen haben und eine abgeleitete Klasse, die als privat/geschützt geerbt wurde.Zugriffserklärung der Basisklasse überladen Methode

  1. Können wir nur eine/mehrere der ursprünglichen Zugriffsebene der überladenen Methoden wiederherstellen?
  2. In GCC 4.4.0 versuche ich, die Basismethoden unter geschützten Zugriff zu setzen, dann vererbt er sie mit privatem Zugriff. Wenn ich versuche, die Zugriffsebene für die Öffentlichkeit wiederherzustellen, funktioniert es! Soll das funktionieren? oder ist es ein Fehler im Compiler? Nach meinem Verständnis sollte das Wiederherstellen der Zugriffsebene nicht dazu verwendet werden können, die Zugriffsebene eines Mitglieds zu fördern oder herabzustufen.

-Code-Schnipsel:

class base { 
    public: 
    void method() {} 
    void method(int x) {} 
    protected: 
    void method2() {} 
}; 

class derived : private base { 
    public: 
    base::method; // Here, i want to restore only the none parameterized method 
    base::method2; // method2 is now public?? 
}; 
+0

BTW- ist eine Deklaration wie 'base :: method' genau äquivalent zu' using base :: method'? – Kos

+0

@Kos, ja aber es ist nicht mehr gültig zu sagen "base :: method;" in C++ 0x. Es wurde durch den Entwurf N3225 entfernt. –

Antwort

4

Ändern Zugänglichkeit von geerbten Funktionen durch eine using Erklärung kann nicht selektiv auf bestimmte Überlastung aus dem einfachen Grunde erfolgen, dass eine using Erklärung nur einen Namen in die deklarative Region und die per Definition einführt, funktioniert Überlastungen die gleiche teilen Name.

Die einzige Alternative, die ich hier sehe, ist trivial Forwarding-Funktionen zu verwenden:

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

    using base::method2; // method2 is now public 
    // method(int) stays inaccessible 
}; 

Ich bin nicht ganz sicher, ob ich Ihre zweite Frage verstehen, aber ja: Sie können Basiselemente Zugänglichkeit in einer abgeleiteten Klasse ändern durch using Deklarationen.

+0

Perfekt, danke .. kombinieren Sie dies mit @DeadMG Antwort für die zweite Frage und wir kann die Frage markieren .. –

1

Sie nicht wiederherstellen Zugriff per se. Sie Set Zugriff. Wie Sie oben tun, können Sie den Zugriff für jede Methode explizit festlegen, einschließlich der zuvor als private deklarierten Methode.

1

Es wäre unmöglich zu verhindern, dass geschützte Methoden öffentlich werden, wenn die abgeleitete Klasse es so wollte, da Sie einfach einen kleineren Wrapper schreiben und fertigstellen könnten. private ist eine andere Sache.

+0

akh ... ja .. das macht Sinn ... danke .. Ich las ein Kapitel aus "C++ Complete References 4. Ed.", Und es gibt einen Absatz, der besagt: "Sie können eine Zugriffsdeklaration verwenden, um die Zugriffsrechte wiederherzustellen Öffentliche und geschützte Member Sie können jedoch eine Zugriffserklärung nicht verwenden, um den Zugriffsstatus eines Mitglieds zu erhöhen oder zu verringern Zum Beispiel kann ein in einer Basisklasse als privat deklariertes Element nicht durch eine abgeleitete Klasse öffentlich gemacht werden dies zu geschehen, würde es zerstören Verkapselungsmechanismus!) ".. Ich denke, er meinte für die Öffentlichkeit und geschützt, um die gleiche Ebene zu sein .. –

Verwandte Themen