...
Abstrakteista luokista ei voida luoda olioita, ainoastaan niiden perillisistä (olettaen, että ne eivät ole abstrakteja), joita myös kutsutaan toteuttaviksi luokiksi. Abstraktit luokat toimivat rajapintana (interface) toteuttavalle luokalle. Kts polymorfismi.
Esimerkki 3. Olioiden käsittely abstraktin (kanta)luokan avulla.
CElain:
Code Block |
---|
#include <iostream>
using namespace std;
// Abstrakti luokka, eli kantaluokka.
class CElain
{
public:
virtual ~CElain() {} // Toteutus tulee olla (tyhjäkin käy).
virtual void Syo() = 0; // Aito virtuaalifunktio.
};
|
CKissa:
Code Block |
---|
// CElain-kantaluokan toteuttava luokka. class CKissa : public CElain { public: void Syo() { cout << printf("Kissa syo kalaa...\n"); } }; |
CKoira:
Code Block |
---|
// CElain-kantaluokan toteuttava luokka. class CKoira : public CElain { public: void Syo() { cout << printf("Koira syo lihaa...\n"); } }; |
CElaintarha:
Code Block |
---|
// Luokka johon voidaan tuoda CElain-luokan perillisiä. class CElainTarha { protected: CElain* Elaimet[100]; // 100 CElain-tyyppistä osoitinta taulukossa int ElainLaskuri; // laskuri, joka kertoo monta Elainta on lisätty ylläolevaan taulukkoon. public: CElainTarha() : ElainLaskuri(0) // nollataan ElainLaskuri { } ~CElainTarha() { for (int i=0; i<ElainLaskuri; i++) { delete Elaimet[i]; } } bool LisaaElain(CElain* Elainelain) { if (ElainLaskuri < 100) { Elaimet[ElainLaskuri] = Elainelain; ElainLaskuri++; return true; } else { return false; } } void SyotaElaimet() { for (int i=0; i<ElainLaskuri; i++) { Elaimet[i]->Syo(); // Kutsutaan kaikkien Elaimien Syo()-funktiota. } } }; |
Code Block |
---|
int main() { CElainTarha ElainTarha; ElainTarha.LisaaElain(new CKissa); ElainTarha.LisaaElain(new CKoira); ElainTarha.LisaaElain(new CKissa); ElainTarha.LisaaElain(new CKoira); ElainTarha.LisaaElain(new CKissa); ElainTarha.SyotaElaimet(); } |
...