2012-04-05 17 views
1

aufzurufen Ich brauche Klärung in aufrufenden Methoden, ich habe eine Basisklasse und von dem ich versuche abgeleitete Klassenfunktion mit abgeleiteten Klassenobjekt aufrufen. in diesem senario ist es möglich,Ist es möglich, abgeleitete Klassenfunktionen von Basisklasse

#include "stdafx.h" 
#include <malloc.h> 

class derived; 

class base 
{ 
public: 
    base() 
    { 

    } 
    ~base() 
    { 
    } 

    void setdptr(derived* dptr) 
    { 
     m_dptr = dptr; 
     dptr->sayHello(); 
    } 

    virtual void addfunc() 
    { 

     printf("base class add"); 
    } 

    derived *m_dptr; 

}; 

class derived : public base 
{ 
public: 
    derived() 
    { 
    } 
    ~derived() 
    { 
    } 

    void addfunc() 
    { 
     printf("derived class add"); 
    } 

    void sayHello() 
    { 
      printf("Say Hello"); 
    } 

    void setDeriveToBase() 
    { 
     setdptr(this); 
    } 

}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    derived dp; 
    dp.setDeriveToBase(); 
    return 0; 
} 
+0

Was ist Ihre Frage? – orlp

+0

Ist es möglich, abgeleitete Klassenfunktionen von der Basisklasse aufzurufen ??? – Naruto

Antwort

1

In der setdptr Funktion in der Klasse base, Sie haben die noch nicht definiert derived Klasse Fulle so dass der Compiler noch nicht weiß, was die Mitglieder in derived sind.

die tatsächlichen Definition von setdptr bis nach der Erklärung von derived bewegen und es sollte funktionieren.

Etwas wie folgt aus:

class derived; 

class base 
{ 
    // .... 

    void setdptr(derived* dptr); 

    // .... 
}; 

class derived : public base 
{ 
    // .... 
}; 

void base::setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 
+0

Danke Joachim Pileborg ... – Naruto

1

in meinem Code

Pls mir sagen, was falsch Was falsch ist, ist, dass

void setdptr(derived* dptr) 
{ 
    m_dptr = dptr; 
    dptr->sayHello(); 
} 

illegal ist. Sie geben nur eine Forward-Deklaration an derived, so dass Sie keine Methoden von es verwenden können, da der Compiler nichts über die Klasse weiß, außer dass es vorhanden ist.

Sie müssen die Deklaration von der Implementierung trennen, die Implementierung in eine cpp Datei verschieben und den Header einschließen, der derived in dieser Datei definiert.

Aber aufgerufene Methoden aus einer Basisklasse ist ein Code-Geruch, Sie sollten es nicht tun müssen.

Verwandte Themen