2011-01-12 6 views
9

Ich verwende private Vererbung in einem Projekt, in dem "implementiert in Bezug auf" -Sinn. Die Basisklasse definiert operator [], und das ist die Funktionalität, die ich verwenden möchte. Also ich habePrivate Vererbung mit Direktive, Überladungen?

class A : private B { 
    using B::operator[]; 
    // ... 
}; 

Wie aber kann ich kontrollieren, welche Version des Betreibers ich bekomme? Tatsächlich brauche ich mehr als eine, sowohl die const als auch die nicht const Versionen. Kann dies erreicht werden?

+3

In diesem Fall könnten Sie Komposition verwenden, um das gewünschte Ergebnis anstelle der privaten Vererbung zu erhalten. – James

+1

Ja, ich weiß ... Ich habe es stattdessen in private Vererbung geändert, um den Umfang des Weiterleitungscodes zu reduzieren. Also ist es nicht möglich? Wie wird die Funktion gewählt? – carlpett

+0

Ihr Code wird viel einfacher zu schreiben und zu pflegen sein, wenn Sie hier Komposition statt privater Vererbung verwenden. Als Faustregel gilt, dass Sie C++ - Features nicht aus der Ferne verwenden sollten, wenn sie nicht absolut notwendig sind (aus dem, was Sie bisher gesagt haben, ist in diesem Fall keine private Vererbung erforderlich). –

Antwort

6

Mein Verständnis ist, dass Ihre using automatisch alle verschiedenen Überlasten des Betreibers einbringen sollte. Gibt es bestimmte Überlastungen, die Sie von der Einführung in die Kindklasse ausschließen möchten? In diesem Fall ist es möglicherweise besser, die Arbeit in mehrere unterschiedlich benannte Funktionen im übergeordneten und nur die benötigten Elemente aufzuteilen.

+0

Ich hätte das auch gedacht, aber ich bekomme Kompilierfehler von const-discussing, obwohl es Versionen gibt, die sowohl 'T &' als auch 'const T &' (Template type T) zurückgeben – carlpett

+0

Also, das ist einer von ihnen "magisch behoben "mal ... Nachdem ich den Code auf- und abwärts gelesen und neu kompiliert habe, funktioniert es plötzlich, und ich kann nicht für das Leben von mir verstehen, was ich verändert habe. Was sich jedoch geändert hat, ist, dass ich ein wenig mehr über die Vererbung gelernt habe, also danke! – carlpett

2

Dies gilt als erwartet:

class A 
{ 
public: 
    int operator[](int idx) { return 0; } 
    int operator[](int idx) const { return 1; } 
}; 

class B : public A 
{ 
public: 
    using A::operator[]; 

    void opa() { cout << operator[](1) << endl; } 
    void opb() const { cout << operator[](1) << endl; } 
}; 

int main(void) 
{ 
    B b; 
    b.opa(); 
    b.opb(); 

    const B d = B(); 
    cout << d[1] << endl; // should trigger the const version of operator[] 
    return 0; 
} 

In anderen Worten, die entsprechenden const/nicht const Versionen in B injiziert werden. Hinweis: Wenn die const-Version nicht bereitgestellt wird, erhalten Sie einen Compiler-Fehler (das funktioniert, ob die Vererbung privat oder öffentlich ist).

+0

Danke, gutes Beispiel! – carlpett

+0

Ich würde auch 'b [2];' oder ähnlich zu 'main' hinzufügen, um zu zeigen, dass die Operatorfunktionen direkt von außerhalb' Klasse B' verwendet werden können. – aschepler

+0

@aschepler, guter Punkt, wird aktualisiert ... – Nim

Verwandte Themen