Monday, December 26, 2016

Bab 9. Soal & Penyelesaian C++


POLIMORFISME





Soal & Penyelesaian
1.       Tulislah sebuah program C++ untuk mendemonstrasikan penggunaan dynamic_cast.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//dynamic_cast.cpp
#include <iostream>
#include <conio.h>
using namespace std;

enum TIPE { KUDA, PEGASUS };

class Kuda
{
public:
    virtual void Berlari(){ cout << "Berlari...\n"; }

private:
    int umurNya;
};

class Pegasus : public Kuda
{
public:
    virtual void Terbang()
    {cout<<"Bisa terbang! Bisa terbang! Bisa terbang!\n";}
};

const int JumlahKuda = 5;

int main()
{
    Kuda* Kandang[JumlahKuda];
    Kuda* pKuda;
    int pilihan,i;

    for (i=0; i<JumlahKuda; i++)
    {
        cout << "(1)Kuda (2)Pegasus: ";
        cin >> pilihan;
        if (pilihan == 2)
            pKuda = new Pegasus;
        else
            pKuda = new Kuda;
            Kandang[i] = pKuda;
    }
    cout << endl;
    for (i=0; i<JumlahKuda; i++)
    {
        Pegasus *pPeg = dynamic_cast< Pegasus *> (Kandang[i]);
        if (pPeg != NULL)
            pPeg->Terbang();
        else
            cout << "Seekor kuda\n";

        delete Kandang[i];
    }

    getch();
    return 0;
}

(1)Kuda (2)Pegasus: 1
(1)Kuda (2)Pegasus: 2
(1)Kuda (2)Pegasus: 1
(1)Kuda (2)Pegasus: 2
(1)Kuda (2)Pegasus: 1

Seekor kuda
Bisa terbang! Bisa terbang! Bisa terbang!
Seekor kuda
Bisa terbang! Bisa terbang! Bisa terbang!
Seekor kuda

2.       Demonstrasikanlah pewarisan jamak, dimana dilakukan penderivasian sebuah kelas baru dari beberapa kelas basis.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//pewarisanJamak.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::cin;
using std::endl;

class Kuda
{
public:
    Kuda() { cout << "konstruktor Kuda ... "; }
    virtual ~Kuda() { cout << "destruktor Kuda ... "; }
    virtual void Mengeluh() const { cout << "Mengeluh!... "; }

private:
    int umurNya;
};

class Burung
{
public:
    Burung() { cout << "konstruktor Burung ... "; }
    virtual ~Burung() { cout << "destruktor Burung ... "; }
    virtual void Bersuara() const { cout << "Bersuara... "; }
    virtual void Terbang() const
    {
        cout << "Saya bisa terbang! Saya bisa terbang! Saya bisa terbang! ";
    }

private:
    int beratNya;
};

class Pegasus : public Kuda, public Burung
{
public:
    void Bersuara() const { Mengeluh(); }
    Pegasus() { cout << "konstruktor Pegasus ... "; }
    ~Pegasus() { cout << "destruktor Pegasus ... "; }
};

const int AngkaAjaib = 2;

int main()
{
    Kuda* Kandang[AngkaAjaib];
    Burung* Aviari[AngkaAjaib];
    Kuda * pKuda;
    Burung * pBurung;
    int pilihan,i;

    for (i=0; i<AngkaAjaib; i++)
    {
        cout << "\n(1)Kuda (2)Pegasus: ";
        cin >> pilihan;
        if (pilihan == 2)
            pKuda = new Pegasus;
        else
            pKuda = new Kuda;
        Kandang[i] = pKuda;
    }
    for (i=0; i<AngkaAjaib; i++)
    {
        cout << "\n(1)Burung (2)Pegasus: ";
        cin >> pilihan;
        if (pilihan == 2)
            pBurung = new Pegasus;
        else
            pBurung = new Burung;
        Aviari[i] = pBurung;
    }

    cout << endl;
    for (i=0; i<AngkaAjaib; i++)
    {
        cout << "\nKandang[" << i << "]: " ;
        Kandang[i]->Mengeluh();
        delete Kandang[i];
    }

    for (i=0; i<AngkaAjaib; i++)
    {
        cout << "\nAviari[" << i << "]: " ;
        Aviari[i]->Bersuara();
        Aviari[i]->Terbang();
        delete Aviari[i];
    }

    getch();
    return 0;
}

(1)Kuda (2)Pegasus: 1
konstruktor Kuda ...
(1)Kuda (2)Pegasus: 2
konstruktor Kuda ... konstruktor Burung ... konstruktor Pegasus ...
(1)Burung (2)Pegasus: 1
konstruktor Burung ...
(1)Burung (2)Pegasus: 2
konstruktor Kuda ... konstruktor Burung ... konstruktor Pegasus ...

Kandang[0]: Mengeluh!... destruktor Kuda ...
Kandang[1]: Mengeluh!... destruktor Pegasus ... destruktor Burung ... destruktor
 Kuda ...
Aviari[0]: Bersuara... Saya bisa terbang! Saya bisa terbang! Saya bisa terbang!
destruktor Burung ...
Aviari[1]: Mengeluh!... Saya bisa terbang! Saya bisa terbang! Saya bisa terbang!
 destruktor Pegasus ... destruktor Burung ... destruktor Kuda ...

3.       Demonstrasikanlah konstruktor-konstruktor pada objek yang mewarisi lebih dari dua kelas basis. Jika Pegasus mewarisi dari Kuda dan Burung, dan tiap kelas basis tersebut memiliki konstruktor yang memiliki parameter, maka kelas Pegasus akan menginisialisasi konstruktor-konstruktor tersebut secara bergiliran. Kode berikut mengilustrasikan permasalahan ini.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//konstruktorPewarisanJamak.cpp
//Memanggil konstruktor-konstruktor kelas basis pada pewarisan jamak
#include <iostream>
#include <conio.h>
using namespace std;

typedef int TUBUH;
enum WARNA { Merah, Hijau, Biru, Kuning, Putih, Hitam, Coklat } ;

class Kuda
{
public:
    Kuda(WARNA warna, TUBUH tinggi);
    virtual ~Kuda() { cout << "konstruktor Kuda ...\n"; }
    virtual void Mengeluh()const { cout << "Mengeluh!... "; }
    virtual TUBUH GetTinggi() const { return tinggiNya; }
    virtual WARNA GetWarna() const { return warnaNya; }

private:
    TUBUH tinggiNya;
    WARNA warnaNya;
};

Kuda::Kuda(WARNA warna, TUBUH tinggi):
warnaNya(warna),tinggiNya(tinggi)
{
    cout << "konstruktor Kuda ...\n";
}

class Burung
{
public:
    Burung(WARNA warna, bool migrasi);
    virtual ~Burung() {cout << "destruktor Burung ...\n"; }
    virtual void Bersuara()const { cout << "Bersuara... "; }
    virtual void Terbang()const
    {
        cout << "Saya bisa terbang! Saya bisa terbang! Saya bisa terbang! ";
    }
    virtual WARNA GetWarna()const { return warnaNya; }
    virtual bool GetMigrasi() const { return migrasiNya; }

private:
    WARNA warnaNya;
    bool migrasiNya;
};

Burung::Burung(WARNA warna, bool migrasi):
warnaNya(warna), migrasiNya(migrasi)
{
    cout << "konstruktor Burung ...\n";
}

class Pegasus : public Kuda, public Burung
{
public:
    void Bersuara()const { Mengeluh(); }
    Pegasus(WARNA, TUBUH, bool,long);
    ~Pegasus() {cout << "destruktor Pegasus ...\n";}
    virtual long GetJumlah() const
    {
        return jumlahNya;
    }

private:
    long jumlahNya;
};

Pegasus::Pegasus(
    WARNA aColor,
    TUBUH tinggi,
    bool migrasi,
    long Jumlah):
        Kuda(aColor, tinggi),
        Burung(aColor, migrasi),
        jumlahNya(Jumlah)
{
    cout << "konstruktor Pegasus...\n";
}

int main()
{
    Pegasus *pPeg = new Pegasus(Merah, 5, true, 10);
    pPeg->Terbang();
    pPeg->Mengeluh();
    cout << "\nPegasus Anda setinggi " << pPeg->GetTinggi();
    cout << " kaki dan ";

    if (pPeg->GetMigrasi())
        cout << "ia bermigrasi.";
    else
        cout << "ia tidak bermigrasi.";
    cout << "\nSebanyak " << pPeg->GetJumlah();
    cout << " orang percaya bahwa ia ada." << endl;
    delete pPeg;

    getch();
    return 0;
}

konstruktor Kuda ...
konstruktor Burung ...
konstruktor Pegasus...
Saya bisa terbang! Saya bisa terbang! Saya bisa terbang! Mengeluh!...
Pegasus Anda setinggi 5 kaki dan ia bermigrasi.
Sebanyak 10 orang percaya bahwa ia ada.
destruktor Pegasus ...
destruktor Burung ...
konstruktor Kuda ...

4.       Apa yang terjadi jika kedua kelas Burung dan Kuda mewarisi dari sebuah kelas basis bersama, seperti Binatang? Gambar berikut mengilustrasikan hal ini.

Tulislah sebuah program C++ untuk mengimplementasikannya.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//kelasBasisBersama.cpp
#include <iostream>
#include <conio.h>
using namespace std;

typedef int TUBUH;
enum WARNA { Merah, Hijau, Biru, Kuning, Putih, Hitam, Coklat } ;

class Binatang // basis bersama untuk kuda dan burung
{
public:
    Binatang(int);
    virtual ~Binatang() { cout << "destruktor Binatang...\n"; }
    virtual int GetUmur() const { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }

private:
    int umurNya;
};

Binatang::Binatang(int umur):
umurNya(umur)
{
    cout << "konstruktor Binatang...\n";
}

class Kuda:public Binatang
{
public:
    Kuda(WARNA warna, TUBUH tinggi, int umur);
    virtual ~Kuda() { cout << "konstruktor Kuda ...\n"; }
    virtual void Mengeluh()const { cout << "Mengeluh!... "; }
    virtual TUBUH GetTinggi() const { return tinggiNya; }
    virtual WARNA GetWarna() const { return warnaNya; }

protected:
    TUBUH tinggiNya;
    WARNA warnaNya;
};

Kuda::Kuda(WARNA warna, TUBUH tinggi, int umur):
Binatang(umur),
warnaNya(warna),tinggiNya(tinggi)
{
    cout << "konstruktor Kuda ...\n";
}

class Burung:public Binatang
{
public:
    Burung(WARNA warna, bool migrasi, int umur);
    virtual ~Burung() {cout << "destruktor Burung ...\n"; }
    virtual void Bersuara()const { cout << "Bersuara... "; }
    virtual void Terbang()const
    {
        cout << "Saya bisa terbang! Saya bisa terbang! Saya bisa terbang! ";
    }
    virtual WARNA GetWarna()const { return warnaNya; }
    virtual bool GetMigrasi()const { return migrasiNya; }

protected:
    WARNA warnaNya;
    bool migrasiNya;
};

Burung::Burung(WARNA warna, bool migrasi, int umur):
Binatang(umur),
warnaNya(warna), migrasiNya(migrasi)
{
    cout << "konstruktor Burung ...\n";
}

class Pegasus : public Kuda, public Burung
{
public:
    void Bersuara()const { Mengeluh(); }
    Pegasus(WARNA, TUBUH, bool, long, int);
    ~Pegasus() {cout << "destruktor Pegasus ...\n";}
    virtual long GetJumlah() const
    {
        return jumlahNya;
    }
    virtual WARNA GetWarna()const { return Kuda::warnaNya; }
    virtual int GetUmur() const { return Kuda::GetUmur(); }

protected:
    long jumlahNya;
};

Pegasus::Pegasus(
    WARNA aColor,
    TUBUH tinggi,
    bool migrasi,
    long Jumlah,
    int umur):
        Kuda(aColor, tinggi, umur),
        Burung(aColor, migrasi, umur),
        jumlahNya(Jumlah)
{
    cout << "konstruktor Pegasus...\n";
}

int main()
{
    Pegasus *pPeg = new Pegasus(Merah, 5, true, 10, 2);
    int umur = pPeg->GetUmur();
    cout << "Pegasus ini berusia " << umur << " tahun.\n";
    delete pPeg;

    getch();
    return 0;
}

konstruktor Binatang...
konstruktor Kuda ...
konstruktor Binatang...
konstruktor Burung ...
konstruktor Pegasus...
Pegasus ini berusia 2 tahun.
destruktor Pegasus ...
destruktor Burung ...
destruktor Binatang...
konstruktor Kuda ...
destruktor Binatang...

5.       Demonstrasikanlah pewarisan virtual, seperti ditunjukkan pada gambar berikut.



Tulislah sebuah program C++ untuk mengimplementasikannya.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//pewarisanVirtual.cpp
#include <iostream>
#include <conio.h>
using namespace std;

typedef int TUBUH;
enum WARNA { Merah, Hijau, Biru, Kuning, Putih, Hitam, Coklat } ;

class Binatang // basis bersama untuk kuda dan burung
{
public:
    Binatang(int);
    virtual ~Binatang() { cout << "destruktor Binatang...\n"; }
    virtual int GetUmur() const { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }

private:
    int umurNya;
};

Binatang::Binatang(int umur):
umurNya(umur)
{
    cout << "konstruktor Binatang...\n";
}

class Kuda:virtual public Binatang
{
public:
    Kuda(WARNA warna, TUBUH tinggi, int umur);
    virtual ~Kuda() { cout << "konstruktor Kuda ...\n"; }
    virtual void Mengeluh()const { cout << "Mengeluh!... "; }
    virtual TUBUH GetTinggi() const { return tinggiNya; }
    virtual WARNA GetWarna() const { return warnaNya; }

protected:
    TUBUH tinggiNya;
    WARNA warnaNya;
};

Kuda::Kuda(WARNA warna, TUBUH tinggi, int umur):
Binatang(umur),
warnaNya(warna),tinggiNya(tinggi)
{
    cout << "konstruktor Kuda ...\n";
}

class Burung:virtual public Binatang
{
public:
    Burung(WARNA warna, bool migrasi, int umur);
    virtual ~Burung() {cout << "destruktor Burung ...\n"; }
    virtual void Bersuara()const { cout << "Bersuara... "; }
    virtual void Terbang()const
    {
        cout << "Saya bisa terbang! Saya bisa terbang! Saya bisa terbang! ";
    }
    virtual WARNA GetWarna()const { return warnaNya; }
    virtual bool GetMigrasi()const { return migrasiNya; }

protected:
    WARNA warnaNya;
    bool migrasiNya;
};

Burung::Burung(WARNA warna, bool migrasi, int umur):
Binatang(umur),
warnaNya(warna), migrasiNya(migrasi)
{
    cout << "konstruktor Burung ...\n";
}

class Pegasus : public Kuda, public Burung
{
public:
    void Bersuara()const { Mengeluh(); }
    Pegasus(WARNA, TUBUH, bool, long, int);
    virtual ~Pegasus() {cout << "destruktor Pegasus ...\n";}
    virtual long GetJumlah() const
    {
        return jumlahNya;
    }
    virtual WARNA GetWarna()const { return Kuda::warnaNya; }
   
private:
    long jumlahNya;
};

Pegasus::Pegasus(
    WARNA aColor,
    TUBUH tinggi,
    bool migrasi,
    long Jumlah,
    int umur):
        Kuda(aColor, tinggi, umur),
        Burung(aColor, migrasi, umur),
        Binatang(umur*2),
        jumlahNya(Jumlah)
{
    cout << "konstruktor Pegasus...\n";
}

int main()
{
    Pegasus *pPeg = new Pegasus(Merah, 5, true, 10, 2);
    int umur = pPeg->GetUmur();
    cout << "Pegasus ini berusia " << umur << " tahun.\n";
    delete pPeg;

    getch();
    return 0;
}

konstruktor Binatang...
konstruktor Kuda ...
konstruktor Burung ...
konstruktor Pegasus...
Pegasus ini berusia 4 tahun.
destruktor Pegasus ...
destruktor Burung ...
konstruktor Kuda ...
destruktor Binatang...

6.       Seringkali, Anda perlu menciptakan sebuah hirarki sedemikian rupa sehingga Anda akan menciptakan sebuah kelas Bangun, dan mewariskannya kepada kelas PersegiPanjang dan kelas Lingkaran. Dari PersegiPanjang, Adan akan mewariskan kepada kelas Persegi, yang merupakan kasus spesial dari PersegiPanjang. Setiap kelas terderivasi akan mendefinisikan-ulang metode Gambar(), metode GetLuas(), dan seterusnya. Demonstrasikanlah dan implementasikanlah kelas Bangun dan kelas-kelas terderivasinya, kelas Lingkaran dan kelas PersegiPanjang.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//kelasBangun.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::cin;
using std::endl;

class Bangun
{
public:
    Bangun(){}
    virtual ~Bangun(){}
    virtual long GetLuas() { return -1; } // error
    virtual long GetKeliling() { return -1; }
    virtual void Gambar() {}

private:
};

class Lingkaran : public Bangun
{
public:
    Lingkaran(int radius):radiusNya(radius){}
    ~Lingkaran(){}
    long GetLuas() { return 3 * radiusNya * radiusNya; }
    long GetKeliling() { return 6 * radiusNya; }
    void Gambar();

private:
    int radiusNya;
    int kelilingNya;
};

void Lingkaran::Gambar()
{
    cout << "Fungsi penggambar Lingkaran di sini!\n";
}

class PersegiPanjang : public Bangun
{
public:
    PersegiPanjang(int pjg, int lebar):
    panjangNya(pjg), lebarNya(lebar){}
    virtual ~PersegiPanjang(){}
    virtual long GetLuas() { return panjangNya * lebarNya; }
    virtual long GetKeliling() {return 2*panjangNya + 2*lebarNya; }
    virtual int GetPanjang() { return panjangNya; }
    virtual int GetLebar() { return lebarNya; }
    virtual void Gambar();

private:
    int lebarNya;
    int panjangNya;
};

void PersegiPanjang::Gambar()
{
    for (int i = 0; i<panjangNya; i++)
    {
        for (int j = 0; j<lebarNya; j++)
            cout << "x ";

        cout << "\n";
   }
}

class Persegi : public PersegiPanjang
{
public:
    Persegi(int pjg);
    Persegi(int pjg, int lebar);
    ~Persegi(){}
    long GetKeliling() {return 4 * GetPanjang();}
};

Persegi::Persegi(int pjg):
PersegiPanjang(pjg,pjg)
{}

Persegi::Persegi(int pjg, int lebar):
PersegiPanjang(pjg,lebar)
{
    if (GetPanjang() != GetLebar())
        cout << "Error, bukan Persegi...bukan PersegiPanjang??\n";
 }

int main()
{
    int pilihan;
    bool fKeluar = false;
    Bangun * sp;

    while ( !fKeluar )
    {
        cout << "(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: ";
        cin >> pilihan;

        switch (pilihan)
        {
            case 0: fKeluar = true;
                    break;
            case 1: sp = new Lingkaran(5);
                    break;
            case 2: sp = new PersegiPanjang(4,6);
                    break;
            case 3: sp = new Persegi(5);
                    break;
            default:
                cout <<"Silahkan masukkan angka antara 0 dan 3"<<endl;
                continue;
                break;
        }
        if( !fKeluar )
            sp->Gambar();
        delete sp;
        sp = 0;
        cout << endl;
    }

    getch();
    return 0;
}

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 1
Fungsi penggambar Lingkaran di sini!

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 2
x x x x x x
x x x x x x
x x x x x x
x x x x x x

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 3
x x x x x
x x x x x
x x x x x
x x x x x
x x x x x

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar:

7.       Demonstrasikanlah penggunaan fungsi virtual murni.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//fungsiVirtualMurni.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::cin;
using std::endl;

class Bangun
{
public:
    Bangun(){}
    virtual ~Bangun(){}
    virtual long GetLuas() = 0;
    virtual long GetKeliling() = 0;
    virtual void Gambar() = 0;

private:
};

void Bangun::Gambar()
{
    cout << "Mekanisme penggambar abstrak!\n";
}

class Lingkaran : public Bangun
{
public:
    Lingkaran(int radius):radiusNya(radius){}
    virtual ~Lingkaran(){}
    long GetLuas() { return 3 * radiusNya * radiusNya; }
    long GetKeliling() { return 6 * radiusNya; }
    void Gambar();

private:
    int radiusNya;
    int kelilingNya;
};

void Lingkaran::Gambar()
{
    cout << "Fungsi penggambar Lingkaran di sini!\n";
    Bangun::Gambar();
}

class PersegiPanjang : public Bangun
{
public:
    PersegiPanjang(int pjg, int lebar):
    panjangNya(pjg), lebarNya(lebar){}
    virtual ~PersegiPanjang(){}
    virtual long GetLuas() { return panjangNya * lebarNya; }
    virtual long GetKeliling() {return 2*panjangNya + 2*lebarNya; }
    virtual int GetPanjang() { return panjangNya; }
    virtual int GetLebar() { return lebarNya; }
    void Gambar();

private:
    int lebarNya;
    int panjangNya;
};

void PersegiPanjang::Gambar()
{
    for (int i = 0; i<panjangNya; i++)
    {
        for (int j = 0; j<lebarNya; j++)
            cout << "x ";

        cout << "\n";
    }
    Bangun::Gambar();
}

class Persegi : public PersegiPanjang
{
public:
    Persegi(int pjg);
    Persegi(int pjg, int lebar);
    virtual ~Persegi(){}
    long GetKeliling() {return 4 * GetPanjang();}
};

Persegi::Persegi(int pjg):
PersegiPanjang(pjg,pjg)
{}

Persegi::Persegi(int pjg, int lebar):
PersegiPanjang(pjg,lebar)
{
    if (GetPanjang() != GetLebar())
        cout << "Error, bukan Persegi...bukan PersegiPanjang??\n";
 }

int main()
{
    int pilihan;
    bool fKeluar = false;
    Bangun * sp;

    while ( !fKeluar )
    {
        cout << "(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: ";
        cin >> pilihan;

        switch (pilihan)
        {
            case 0: fKeluar = true;
                    break;
            case 1: sp = new Lingkaran(5);
                    break;
            case 2: sp = new PersegiPanjang(4,6);
                    break;
            case 3: sp = new Persegi(5);
                    break;
            default:
                cout <<"Silahkan masukkan angka antara 0 dan 3"<<endl;
                continue;
                break;
        }
        if( !fKeluar )
            sp->Gambar();
        delete sp;
        sp = 0;
        cout << endl;
    }

    getch();
    return 0;
}

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 1
Fungsi penggambar Lingkaran di sini!
Mekanisme penggambar abstrak!

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 2
x x x x x x
x x x x x x
x x x x x x
x x x x x x
Mekanisme penggambar abstrak!

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar: 3
x x x x x
x x x x x
x x x x x
x x x x x
x x x x x
Mekanisme penggambar abstrak!

(1)Lingkaran (2)PersegiPanjang (3)Persegi (0)Keluar:

8.       Demonstrasikanlah mekanisme pewarisan kelas abstrak dari kelas abstrak lainnya.
Penyelesaian:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//pewarisanAbstrak.cpp
#include <iostream>
#include <conio.h>
using namespace std;

enum WARNA { Merah, Hijau, Biru, Kuning, Putih, Hitam, Coklat } ;

class Binatang // kelas basis bersama untuk Mammal dan Ikan
{
public:
    Binatang(int);
    virtual ~Binatang() { cout << "destruktor Binatang ...\n"; }
    virtual int GetUmur() const { return umurNya; }
    virtual void SetUmur(int umur) { umurNya = umur; }
    virtual void Tidur() const = 0;
    virtual void Makan() const = 0;
    virtual void Reproduksi() const = 0;
    virtual void Bergerak() const = 0;
    virtual void Bicara() const = 0;

private:
    int umurNya;
};

Binatang::Binatang(int umur):
umurNya(umur)
{
    cout << "konstruktor Binatang ...\n";
}

class Mammal : public Binatang
{
public:
    Mammal(int umur):Binatang(umur)
    { cout << "konstruktor Mammal ...\n";}
    virtual ~Mammal() { cout << "destruktor Mammal ...\n";}
    virtual void Reproduksi() const
    { cout << "Reproduksi Mammal...\n"; }
};

class Ikan : public Binatang
{
public:
    Ikan(int umur):Binatang(umur)
    { cout << "konstruktor Ikan ...\n";}
    virtual ~Ikan() {cout << "destruktor Ikan ...\n"; }
    virtual void Tidur() const { cout << "Ikan mengorok...\n"; }
    virtual void Makan() const { cout << "Ikan makan...\n"; }
    virtual void Reproduksi() const
    { cout << "Ikan bertelur...\n"; }
    virtual void Bergerak() const
    { cout << "Ikan berenang...\n"; }
    virtual void Bicara() const { }
};

class Kuda : public Mammal
{
public:
    Kuda(int umur, WARNA warna ):
    Mammal(umur), warnaNya(warna)
    { cout << "konstruktor Kuda ...\n"; }
    virtual ~Kuda() { cout << "destruktor Kuda ...\n"; }
    virtual void Bicara()const { cout << "Mengeluh!... \n"; }
    virtual WARNA GetWarnaNya() const { return warnaNya; }
    virtual void Tidur() const
    { cout << "Kuda mengorok...\n"; }
    virtual void Makan() const { cout << "Kuda makan...\n"; }
    virtual void Bergerak() const { cout << "Kuda berlari...\n";}

protected:
    WARNA warnaNya;
};

class Anjing : public Mammal
{
public:
    Anjing(int umur, WARNA warna ):
    Mammal(umur), warnaNya(warna)
    { cout << "konstruktor Anjing ...\n"; }
    virtual ~Anjing() { cout << "destruktor Anjing ...\n"; }
    virtual void Bicara()const { cout << "Guk Guk!... \n"; }
    virtual void Tidur() const { cout << "Anjing mengorok...\n"; }
    virtual void Makan() const { cout << "Anjing makan...\n"; }
    virtual void Bergerak() const { cout << "Anjing berlari...\n"; }
    virtual void Reproduksi() const
    { cout << "Anjing bereproduksi ...\n"; }

protected:
    WARNA warnaNya;
};

int main()
{
    Binatang *pBinatang=0;
    int pilihan;
    bool fKeluar = false;

    while (fKeluar == false)
    {
        cout << "(1)Anjing (2)Kuda (3)Ikan (0)Keluar: ";
        cin >> pilihan;

        switch (pilihan)
        {
            case 1: pBinatang = new Anjing(5,Coklat);
                    break;
            case 2: pBinatang = new Kuda(4,Hitam);
                    break;
            case 3: pBinatang = new Ikan (5);
                    break;
            default: fKeluar = true;
                     break;
        }
        if (fKeluar == false)
        {
            pBinatang->Bicara();
            pBinatang->Makan();
            pBinatang->Reproduksi();
            pBinatang->Bergerak();
            pBinatang->Tidur();
            delete pBinatang;
            cout << endl;
        }
    }

    getch();
    return 0;
}

(1)Anjing (2)Kuda (3)Ikan (0)Keluar: 1
konstruktor Binatang ...
konstruktor Mammal ...
konstruktor Anjing ...
Guk Guk!...
Anjing makan...
Anjing bereproduksi ...
Anjing berlari...
Anjing mengorok...
destruktor Anjing ...
destruktor Mammal ...
destruktor Binatang ...

(1)Anjing (2)Kuda (3)Ikan (0)Keluar: 2
konstruktor Binatang ...
konstruktor Mammal ...
konstruktor Kuda ...
Mengeluh!...
Kuda makan...
Reproduksi Mammal reproduction ...
Kuda berlari...
Kuda mengorok...
destruktor Kuda ...
destruktor Mammal ...
destruktor Binatang ...

(1)Anjing (2)Kuda (3)Ikan (0)Keluar: 3
konstruktor Binatang ...
konstruktor Ikan ...
Ikan makan...
Ikan bertelur...
Ikan berenang...
Ikan mengorok...
destruktor Ikan ...
destruktor Binatang ...

(1)Anjing (2)Kuda (3)Ikan (0)Keluar:


















No comments:

Post a Comment