2016-06-24 20 views
1

Wir können kein Objekt einer abstrakten Klasse erstellen, oder? Wie kann ich also eine virtuelle Funktion aufrufen, die sowohl in der abstrakten Basisklasse als auch in der abgeleiteten Klasse definiert ist? Ich möchte den Code in der abstrakten Basisklasse ausführen, aber momentan verwende ich das Objekt der abgeleiteten Klasse.Wie kann ich virtuelle Funktionsdefinition der Basisklasse aufrufen, die Definitionen sowohl in der abstrakten Basisklasse als auch in der abgeleiteten Klasse in C++ haben?

class T 
{ 
    public: 
    virtual int f1()=0; 
    virtual int f2() { a = 5; return a } 
} 
class DT : public T 
{ 
    public: 
    int f1() { return 10; } 
    int f2() { return 4; } 
} 

int main() 
{ 
    T *t; 
    t = new DT(); 
    ............ 
} 

Gibt es eine Möglichkeit, die Basisklasse Funktion mit dem Objekt t aufrufen? Wenn es nicht möglich ist, was muss ich tun, um die Basisklassenfunktion aufzurufen?

+1

Wie ein Minimal, komplett erstellen und prüfbare Beispiel http://stackoverflow.com/ help/mcve –

+0

@RichardCritten Nützlich im Allgemeinen, aber um fair zu sein, ist die OP-Beschreibung des Codes gut genug, um zu verstehen, wie sie ist. – Angew

Antwort

4

Genau wie Sie jede andere Basisklassenimplementierung nennen würden: explizite Qualifikation verwenden, um den dynamischen Dispatch-Mechanismus zu umgehen.

struct AbstractBase 
{ 
    virtual void abstract() = 0; 

    virtual bool concrete() { return false; } 
}; 

struct Derived : AbstractBase 
{ 
    void abstract() override {} 

    bool concrete() override { return true; } 
}; 

int main() 
{ 
    // Use through object: 
    Derived d; 
    bool b = d.AbstractBase::concrete(); 
    assert(!b); 

    // Use through pointer: 
    AbstractBase *a = new Derived(); 
    b = a->AbstractBase::concrete(); 
    assert(!b); 
} 
+0

Bitte überprüfen Sie den hinzugefügten Code. – aaroh

+2

@aaroh Das kompiliert nicht. Vielleicht hätte es "T * t" sein sollen? Wenn ja, tue einfach "t-> T :: f2()'; und bearbeiten Sie Ihre Frage, um den richtigen Code zu haben. – Angew

1

Sie können den Klassenbereich explizit angeben, beim Aufruf der Funktion:

class A { /* Abstract class */ }; 
    class B : public A {} 

    B b; 
    b.A::foo(); 
1

Wenn die abstrakte Basisklasse einen Code hat, dann rufen Sie einfach Baseclass :: AbstractFunction()

class Base 
{ 
    virtual void Function() {} 
} 

class Derived : Base 
{ 
    virtual void Function() { Base::Function(); } 
}