2016-08-19 3 views
7
class Base { 
public: 
    virtual void f() {} 
}; 

class Derived : private Base { 
public: 
    void f() override {} 
}; 

Meine Frage gibt es irgendwelche Verwendung für solche Überschreibung? Private Vererbung bedeutet, dass Sie Derived in Base Zeiger nicht speichern können, und es wird daher nie benötigt, dynamisch f auf den richtigen Typ zu senden.Warum unter privater Vererbung überschreiben?

+1

Hinweis: Einige Verfahren in 'Base' ruft' this-> f() '. Ruft es 'Base :: f()' oder 'Derived :: f()' auf? – dhke

+0

können Sie C-Style Cast verwenden, um 'Derived *' in 'Base *' zu speichern. – Ven

+0

@Ven: Sie können C-Style-Casts verwenden, um fast alles in irgendetwas zu speichern. Sie werden jedoch nicht immer definiertes Verhalten bekommen ;-). – dhke

Antwort

7

Nur ein Beispiel: Eine Funktion von Derived::f1() kann eine (öffentliche oder geschützte) Funktion von Base::f2() aufrufen, die wiederum f() aufrufen kann. In diesem Fall ist dynamischer Versand erforderlich. Hier

ist ein Beispielcode:

#include "iostream" 
using namespace std; 

class Base { 
    public: 
    virtual void f() { 
     cout << "Base::f() called.\n"; 
    } 
    void f2() { 
     f(); // Here, a dynamic dispatch is done! 
    } 
}; 

class Derived:private Base { 
    public: 
    void f() override { 
     cout << "Derived::f() called.\n"; 
    } 
    void f1() { 
     Base::f2(); 
    } 
}; 

int main() { 
    Derived D; 
    D.f1(); 
    Base B; 
    B.f2(); 
} 

Ausgang:

Derived::f() called 
Base::f() called 
+0

Können Sie ein Beispiel angeben oder das obige Beispiel bitte ausfüllen? – mkmostafa

+0

In Ihrem Beispiel, wenn ich richtig verstanden habe, wird Base :: f immer aufgerufen. – mkmostafa

+0

@mkmostafa: OK, ich habe ein Beispiel hinzugefügt. Kompilieren Sie es einfach und überzeugen Sie sich selbst. – ralfg

Verwandte Themen