C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung zur Lektion "Virtuelle Memberfunktionen"


// Lösung zu virtuellen Memberfunktionen

// Zuerst Dateien einbinden
#include <iostream>
#include <string>

// Nun Namensraum auf std setzen
using namespace std;

// Definition der Basisklasse CWinBase
// CWinBase enthält die Grunddaten zur Beschreibung eines Fensters
// HINWEIS: Der protected-Konstruktor verhindert dass ein Objekt
// der Klasse CWinBase direkt erzeugt werden kann! Der Destruktor
// dagegen muss public sein
class CWinBase
{
    short   nXPos, nYPos;                   // Koordinaten des Fensters
    short   nWidth, nHeight;                // Grösse des Fensters
  protected:                                // protected Konstruktor!
    CWinBase(short nXP, short nYP, short nW, short nH);
  public:
    virtual ~CWinBase()                     // virtueller public-Destruktor
    {}
    virtual void Draw() const = 0;          // pure virtual Memberfunktionen
};
// Definition der Memberfunktionen
// Konstruktor
CWinBase::CWinBase(short nXP, short nYP, short nW, short nH)
{
    nXPos = nXP;
    nYPos = nYP;
    nWidth = nW;
    nHeight = nH;
}
// Ausgabe der Position und Grösse
void CWinBase::Draw() const
{
    cout << "Position: (" << nXPos << "," << nYPos << ")\n";
    cout << "Grösse : (" << nWidth << "," << nHeight << ")\n";
}

// Definition der Klasse CWindow
class CWindow: public CWinBase
{
    string sTitle;                      // Beschriftung
  public:
    CWindow(short, short, short, short, const char *const);
    void Draw() const;
};
// Definition der Memberfunktionen
// Konstruktor
CWindow::CWindow (short nX, short nY, short nW,
                  short nH, const char *const pszT):
    CWinBase(nX, nY, nW, nH),
    sTitle(pszT)
{
}
// Ausgabe der Fensterdaten
void CWindow::Draw() const
{
    CWinBase::Draw();
    cout << "Beschriftung: " << sTitle << endl;
}

// Definition der Klasse CButton
class CButton: public CWindow
{
    short   nButtonID;                      // Button-Nummer
  public:
    CButton(short, short, short, short, const char *const, short);
    void Draw() const;
};
// Definition der Memberfunktionen
// Konstruktor
CButton::CButton (short nX, short nY, short nW, short nH,
                  const char *const pszT, short nBID):
    CWindow(nX, nY, nW, nH, pszT),
    nButtonID(nBID)
{
}
// Ausgabe der Buttondaten
void CButton::Draw() const
{
    // Achtung! Es wird Draw() von CWindow aufgerufen!
    CWindow::Draw();
    cout << "Button-ID: " << nButtonID << endl;
}

// main() Funktion
int main()
{
    // Feld für 2 Objektzeiger definieren
    CWinBase    *pCObjects[2];

    // Fenster-Objekt erzeugen
    pCObjects[0] = new CWindow(10,10,200,100,"Fensterobjekt");
    // Button-Objekt erzeugen
    pCObjects[1] = new CButton(50,50,100,50,"Buttonobjekt",10);

    // Objektdaten ausgeben
    cout << "Daten des CWindow-Objekts:\n";
    pCObjects[0]->Draw();
    cout << "\nDaten des CButton-Objekts:\n";
    pCObjects[1]->Draw();

    // Objekte wieder löschen!
    delete pCObjects[0];
    delete pCObjects[1];

}