2016-06-06 16 views
2
#include <iostream> 

class Base 
{ 
public: 
    virtual ~Base() {} 
    virtual void f() 
    { 
     std::cout << "base\n"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual ~Derived() {} 
    virtual void f()  
    { 
     std::cout << "derived\n"; 
    } 
}; 

int main() 
{ 
    Derived* D = new Derived; 
    D->f(); 
    delete D; 
    return 0; 
} 

So rufe ich Derived::f, aber ich möchte Base::f auch anrufen. Gibt es einen anderen Weg als Base::f() innerhalb Derived::f() zu nennen?Call-Funktion von abgeleiteten und Basisklasse

+4

'D> Basis :: f();' –

+0

@PiotrSkotnicki Aber dann ist es nicht Abgeleitet Anruf :: f() – BoomShh

+0

So haben Sie eine fehlerhafte Konstruktion. Warum brauchen Sie einen Mechanismus, der beide Funktionen aufruft, wenn Sie es selbst tun können? –

Antwort

2

Klingt wie, was Sie wollen, ist ein Non Virtual Interface (NVI) Design. Dies ist ideal, wenn Sie Anpassungspunkte (z. B. Polymorphismus) für abgeleitete Klassen, aber einen etwas garantierten Aufruffluss wünschen.

class Base 
{ 
public: 

    virtual ~Base() {} 

    void f() 
    { 
     // ... do something that always run before 
     f_impl(); 
     // ... and after the extension point 
    } 

protected: 

    virtual void f_impl() 
    { 
    } 
}; 

class Derived : public Base 
{ 
protected: 

    virtual void f_impl() override 
    { 
     std::cout << "extended!\n"; 
    } 
}; 

int main() 
{ 
    Derived d; 
    d.f(); // Base can _always_ run things before and after Derived 
} 
Verwandte Themen