Monday, December 26, 2016

Bab 8. Soal & Penyelesaian C++


PEWARISAN





Soal & Penyelesaian
1.       Tulislah sebuah program C++ untuk mendemonstrasikan mekanisme pewarisan sederhana.
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
// pewarisanSederhana.cpp
#include <iostream>
using namespace std;

enum VARIETAS { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
    // konstruktor
    Mammal();
    ~Mammal();

    //aksesor
    int GetUmur() const;
    void SetUmur(int);
    int GetBerat() const;
    void SetBerat();

    //metode-metode lain
    void Bicara() const;
    void Tidur() const;


protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:

    // konstruktor
    Anjing();
    ~Anjing();

    // aksesor
    VARIETAS GetVarietas() const;
    void SetVarietas(VARIETAS);

    // metode-metode lain
    void GoyangEkor();
    void MintaMakan();

protected:
    VARIETAS varietasNya;
};

2.       Ujilah mekanisme pewarisan pada soal nomor 1 tersebut.
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
// ujiPewarisanSederhana.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

enum VARIETAS { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
    // konstruktor
    Mammal():umurNya(2), beratNya(5){}
    ~Mammal(){}

    //aksesor
    int GetUmur() const { return umurNya; }
    void SetUmur(int umur) { umurNya = umur; }
    int GetBerat() const { return beratNya; }
    void SetBerat(int berat) { beratNya = berat; }

    //metode-metode lain
    void Bicara() const { cout << "Suara mammal!\n"; }
    void Tidur() const { cout << "shhh. Saya sedang tidur.\n"; }


protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:

    // konstruktor
    Anjing():varietasNya(GOLDEN){}
    ~Anjing(){}

    // aksesor
    VARIETAS GetVarietas() const { return varietasNya; }
    void SetVarietas(VARIETAS varietas) { varietasNya = varietas; }

    // metode-metode lain
    void GoyangEkor() const { cout << "Ekor bergoyang-goyang...\n"; }
    void MintaMakan() const { cout << "Meminta makanan...\n"; }

protected:
    VARIETAS varietasNya;
};

int main()
{
    Anjing Fido;
    Fido.Bicara();
    Fido.GoyangEkor();
    cout << "Fido berusia " << Fido.GetUmur() << " tahun" << endl;

    getch();
    return 0;
}

Suara mammal!
Ekor bergoyang-goyang...
Fido berusia 2 tahun

3.       Demonstrasikanlah mekanisme pewarisan pada soal nomor 2 yang melibatkan konstruktor dan destruktor.
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
// pewarisanKonstruktorDestruktor.cpp
#include <iostream>
#include <conio.h>
using namespace std;

enum VARIETAS { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
    // konstruktor
    Mammal();
    ~Mammal();

    //aksesor
    int GetUmur() const { return umurNya; }
    void SetUmur(int umur) { umurNya = umur; }
    int GetBerat() const { return beratNya; }
    void SetBerat(int berat) { beratNya = berat; }

    //metode-metode lain
    void Bicara() const { cout << "Suara mammal!\n"; }
    void Tidur() const { cout << "shhh. Saya sedang tidur.\n"; }


protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:

    // konstruktor
    Anjing();
    ~Anjing();

    // aksesor
    VARIETAS GetVarietas() const { return varietasNya; }
    void SetVarietas(VARIETAS varietas) { varietasNya = varietas; }

    // metode-metode lain
    void GoyangEkor() const { cout << "Ekor bergoyang-goyang...\n"; }
    void MintaMakan() const { cout << "Meminta makanan...\n"; }

private:
    VARIETAS varietasNya;
};

Mammal::Mammal():umurNya(3), beratNya(5)
{
    std::cout << "konstruktor mammal... " << endl;
}

Mammal::~Mammal()
{
    std::cout << "destruktor mammal... " << endl;
}

Anjing::Anjing():varietasNya(GOLDEN)
{
    std::cout << "konstruktor Anjing... " << endl;
}

Anjing::~Anjing()
{
    std::cout << "destruktor Anjing... " << endl;
}

int main()
{
    Anjing Fido;
    Fido.Bicara();
    Fido.GoyangEkor();
    cout << "Fido berusia " << Fido.GetUmur() << " tahun" << endl;

    getch();
    return 0;
}

konstruktor mammal...
konstruktor Anjing...
Suara mammal!
Ekor bergoyang-goyang...
Fido berusia 3 tahun

4.       Tulislah sebuah program C++ dimana dilakukan pelewatan argumen kepada konstruktor 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
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
// pelewatanKonstruktorBasis.cpp
#include <iostream>
#include <conio.h>
using namespace std;

enum VARIETAS { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
    // konstruktor
    Mammal();
       Mammal(int umur);
    ~Mammal();

    //aksesor
    int GetUmur() const { return umurNya; }
    void SetUmur(int umur) { umurNya = umur; }
    int GetBerat() const { return beratNya; }
    void SetBerat(int berat) { beratNya = berat; }

    //metode-metode lain
    void Bicara() const { cout << "Suara mammal!\n"; }
    void Tidur() const { cout << "shhh. Saya sedang tidur.\n"; }


protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:

    // konstruktor
    Anjing();
    Anjing(int umur);
    Anjing(int umur, int berat);
    Anjing(int umur, VARIETAS varietas);
    Anjing(int umur, int berat, VARIETAS varietas);
    ~Anjing();

    // aksesor
    VARIETAS GetVarietas() const { return varietasNya; }
    void SetVarietas(VARIETAS varietas) { varietasNya = varietas; }

    // metode-metode lain
    void GoyangEkor() const { cout << "Ekor bergoyang-goyang...\n"; }
    void MintaMakan() const { cout << "Meminta makanan...\n"; }

private:
    VARIETAS varietasNya;
};

Mammal::Mammal():umurNya(1), beratNya(5)
{
    cout << "konstruktor mammal..." << endl;
}

Mammal::Mammal(int umur): umurNya(umur), beratNya(5)
{
    cout << "konstruktor Mammal(int) ..." << endl;
}

Mammal::~Mammal()
{
    std::cout << "destruktor mammal... " << endl;
}

Anjing::Anjing():Mammal(), varietasNya(GOLDEN)
{
    cout << "konstruktor Anjing..." << endl;
}

Anjing::Anjing(int umur):
Mammal(umur),
varietasNya(GOLDEN)
{
    cout << "konstruktor Anjing(int) ..." << endl;
}

Anjing::Anjing(int umur, int berat):
Mammal(umur),
varietasNya(GOLDEN)
{
    beratNya = berat;
    cout << "konstruktor Anjing(int, int) ..." << endl;
}

Anjing::Anjing(int umur, int berat, VARIETAS varietas):
Mammal(umur),
varietasNya(varietas)
{
    beratNya = berat;
    cout << "konstruktor Anjing(int, int, varietas) ..." << endl;
}

Anjing::Anjing(int umur, VARIETAS varietas):
Mammal(umur),
varietasNya(varietas)
{
    cout << "konstruktor Anjing(int, varietas) ..." << endl;
}

Anjing::~Anjing()
{
    cout << "destruktor Anjing ..." << endl;
}

int main()
{
    Anjing Fido;
    Anjing rover(5);
    Anjing buster(6,8);
    Anjing yorkie (3,GOLDEN);
    Anjing dobbie (4,20,DOBERMAN);
    Fido.Bicara();
    rover.GoyangEkor();

    cout << "Yorkie berusia " << yorkie.GetUmur()
         << " tahun" << endl;
    cout << "Dobbie memiliki berat badan ";
    cout << dobbie.GetBerat() << " kilogram" << endl;

    getch();
    return 0;
}

konstruktor mammal...
konstruktor Anjing...
konstruktor Mammal(int) ...
konstruktor Anjing(int) ...
konstruktor Mammal(int) ...
konstruktor Anjing(int, int) ...
konstruktor Mammal(int) ...
konstruktor Anjing(int, varietas) ...
konstruktor Mammal(int) ...
konstruktor Anjing(int, int, varietas) ...
Suara mammal!
Ekor bergoyang-goyang...
Yorkie berusia 3 tahun
Dobbie memiliki berat badan 20 kilogram

5.       Tulislah sebuah program C++ dimana dilakukan pendefinisian-ulang (overriding) terhadap fungsi-fungsi kelas basis pada kelas terderivasi.
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
// pendefinisianUlangFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;

enum VARIETAS { GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

class Mammal
{
public:
    // konstruktor
    Mammal() { cout << "konstruktor Mammal ...\n"; }
    ~Mammal() { cout << "destruktor Mammal ...\n"; }

    //metode-metode lain
    void Bicara() const { cout << "Suara mammal!\n"; }
    void Tidur() const { cout << "shhh. Saya sedang tidur.\n"; }


protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:

    // konstruktor
    Anjing(){ cout << "konstruktor Anjing ...\n"; }
    ~Anjing(){ cout << "destruktor Anjing ...\n"; }

    // metode-metode lain
    void GoyangEkor() const { cout << "Ekor bergoyang-goyang...\n"; }
    void MintaMakan() const { cout << "Meminta makanan...\n"; }
    void Bicara() const { cout << "Gung Gung!\n"; }

private:
    VARIETAS varietasNya;
};

int main()
{
    Mammal binatangBesar;
    Anjing Fido;
    binatangBesar.Bicara();
    Fido.Bicara();

    getch();
    return 0;
}

konstruktor Mammal ...
konstruktor Mammal ...
konstruktor Anjing ...
Suara mammal!
Gung Gung!

6.       Pada kode pada soal nomor 5, metode Bicara() pada kelas Anjing menyembunyikan metode Bicara() pada kelas basis. Hal ini dapat menyebabkan hasil yang tak diinginkna. Jika kelas Mammal memiliki sebuah metode, Bergerak(), yang dioverload, dan kelas Anjing mendefinisikan-ulang metode tersebut, maka metode Bergerak() pada kelas Anjing akan menyembunyikan semua metode Bergerak() (termasuk metode-metode teroverload) pada kelas Mammal. 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
// sembunyikanMetode.cpp
#include <iostream>
#include <conio.h>
using std::cout;

class Mammal
{
public:
    void Bergerak() const { cout << "Mammal bergerak satu langkah.\n"; }
    void Bergerak(int jarak) const
    {
        cout << "Mammal bergerak ";
        cout << jarak <<" langkah.\n";
    }

protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:
    // metode ini menyembunyikan semua metode Bergerak pada kelas basis (Mammal)
    void Bergerak() const { cout << "Anjing bergerak 5 langkah.\n"; }
};

int main()
{
    Mammal binatangBesar;
    Anjing Fido;
    binatangBesar.Bergerak();
    binatangBesar.Bergerak(2);
    Fido.Bergerak();

    // Fido.Bergerak(10);
    getch();
    return 0;
}

Mammal bergerak satu langkah.
Mammal bergerak 2 langkah.
Anjing bergerak 5 langkah.

7.       Demonstrasikanlah pemanggilan metode pada kelas basis dari metode yang didefinisikan-ulang pada kelas terderivasi.
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
// memanggilMetodeBasis.cpp
#include <iostream>
#include <conio.h>
using std::cout;

class Mammal
{
public:
    void Bergerak() const { cout << "Mammal bergerak satu langkah.\n"; }
    void Bergerak(int jarak) const
    {
        cout << "Mammal bergerak ";
        cout << jarak <<" langkah.\n";
    }

protected:
    int umurNya;
    int beratNya;
};

class Anjing : public Mammal
{
public:
    void Bergerak() const;
};

void Anjing::Bergerak() const
{
    cout << "Dalam gerak anjing...\n";
    Mammal::Bergerak(3);
}

int main()
{
    Mammal binatangBesar;
    Anjing Fido;
    binatangBesar.Bergerak(2);
    Fido.Mammal::Bergerak(6);

    getch();
    return 0;
}

Mammal bergerak 2 langkah.
Mammal bergerak 6 langkah.

8.       Demonstrasikanlah penggunaan metode virtual.
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
// metodeVirtual.cpp
#include <iostream>
#include <conio.h>
using std::cout;

class Mammal
{
public:
    Mammal():umurNya(1) { cout << "konstruktor Mammal ...\n"; }
    virtual ~Mammal() { cout << "destruktor Mammal ...\n"; }
    void Bergerak() const { cout << "Mammal bergerak satu langkah\n"; }
    virtual void Bicara() const { cout << "Mammal bicara!\n"; }

protected:
    int umurNya;
};

class Anjing : public Mammal
{
public:
    Anjing() { cout << "konstruktor Anjing...\n"; }
    virtual ~Anjing() { cout << "destruktor Anjing...\n"; }
    void WagTail() { cout << "Menggoyang ekor...\n"; }
    void Bicara()const { cout << "Guk Guk!\n"; }
    void Bergerak()const { cout << "Anjing bergerak 5 langkah lagi...\n"; }
};

int main()
{
    Mammal *pAnjing = new Anjing;
    pAnjing->Bergerak();
    pAnjing->Bicara();

    getch();
    return 0;
}

konstruktor Mammal ...
konstruktor Anjing...
Mammal bergerak satu langkah
Guk Guk!

9.       Demonstrasikanlah beberapa metode virtual yang dipanggil secara bergiliran.
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
// metodeVirtualBergiliran.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::cin;

class Mammal
{
public:
    Mammal():umurNya(1) {}
    virtual ~Mammal() {}
    virtual void Bicara() const { cout << "Mammal bicara!\n"; }

protected:
    int umurNya;
};

class Anjing : public Mammal
{
public:
    void Bicara()const { cout << "Guk Guk!\n"; }
};

class Kucing : public Mammal
{
public:
    void Bicara()const { cout << "Ngeonk Ngeonk!\n"; }
};

class Kuda : public Mammal
{
public:
    void Bicara()const { cout << "Nguahhh Nguahhh!\n"; }
};

class Babi : public Mammal
{
public:
    void Bicara()const { cout << "Horja Horja!\n"; }
};

int main()
{
    Mammal* arrayKu[5];
    Mammal* ptr;

    int pilihan, i;
    for ( i = 0; i<5; i++)
    {
        cout << "(1)anjing (2)kucing (3)kuda (4)babi: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 1: ptr = new Anjing;
                    break;
            case 2: ptr = new Kucing;
                    break;
            case 3: ptr = new Kuda;
                    break;
            case 4: ptr = new Babi;
                    break;
            default: ptr = new Mammal;
                     break;
        }
        arrayKu[i] = ptr;
    }
    for (i=0;i<5;i++)
        arrayKu[i]->Bicara();

    getch();
    return 0;
}

(1)anjing (2)kucing (3)kuda (4)babi: 1
(1)anjing (2)kucing (3)kuda (4)babi: 2
(1)anjing (2)kucing (3)kuda (4)babi: 3
(1)anjing (2)kucing (3)kuda (4)babi: 4
(1)anjing (2)kucing (3)kuda (4)babi: 5
Guk Guk!
Ngeonk Ngeonk!
Nguahhh Nguahhh!
Horja Horja!
Mammal bicara!

10.    Perhatikan bahwa fungsi virtual hanya dapat diterapkan pada pointer dan referensi. Pelewatan sebuah objek dengan nilai tidak dapat menyebabkan fungsi virtual dipanggil. Demonstrasikanlah 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
// fungsiVirtualNilai.cpp
#include <iostream>
#include <conio.h>
using std::cout;
using std::cin;

class Mammal
{
public:
    Mammal():umurNya(1) {}
    virtual ~Mammal() {}
    virtual void Bicara() const { cout << "Mammal bicara!\n"; }

protected:
    int umurNya;
};

class Anjing : public Mammal
{
public:
    void Bicara()const { cout << "Guk Guk!\n"; }
};

class Kucing : public Mammal
{
public:
    void Bicara()const { cout << "Ngeonk Ngeonk!\n"; }
};

void FungsiNilai (Mammal);
void FungsiPointer (Mammal*);
void FungsiReferensi (Mammal&);

int main()
{
    Mammal* ptr=0;
    int pilihan;
    while (1)
    {
        bool fKeluar = false;
        cout << "(1)anjing (2)kucing (0)keluar: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case 0: fKeluar = true;
                    break;
            case 1: ptr = new Anjing;
                    break;
            case 2: ptr = new Kucing;
                    break;
            default: ptr = new Mammal;
                     break;
        }
        if (fKeluar == true)
            break;

        FungsiPointer(ptr);
        FungsiReferensi(*ptr);
        FungsiNilai(*ptr);
    }
    getch();
    return 0;
}

void FungsiNilai(Mammal NilaiMammal)
{
    NilaiMammal.Bicara();
}

void FungsiPointer(Mammal * pMammal)
{
    pMammal->Bicara();
}

void FungsiReferensi(Mammal & rMammal)
{
    rMammal.Bicara();
}

(1)anjing (2)kucing (0)keluar: 1
Guk Guk!
Guk Guk!
Mammal bicara!
(1)anjing (2)kucing (0)keluar: 2
Ngeonk Ngeonk!
Ngeonk Ngeonk!
Mammal bicara!
(1)anjing (2)kucing (0)keluar:

11.    Demonstrasikanlah konstruktor penyalin virtual.
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
// konstruktorPenyalinVirtual.cpp
#include <iostream>
#include <conio.h>
using namespace std;

class Mammal
{
public:
    Mammal():umurNya(1) { cout << "konstruktor Mammal...\n"; }
    virtual ~Mammal() { cout << "destruktor Mammal...\n"; }
    Mammal (const Mammal & rhs);
    virtual void Bicara() const { cout << "Mammal berbicara!\n"; }
    virtual Mammal* Klon() { return new Mammal(*this); }
    int GetUmur()const { return umurNya; }

protected:
    int umurNya;
};

Mammal::Mammal (const Mammal & rhs):umurNya(rhs.GetUmur())
{
    cout << "Konstruktor penyalin Mammal ...\n";
}

class Anjing : public Mammal
{
public:
    Anjing() { cout << "konstruktor Anjing ...\n"; }
    virtual ~Anjing() { cout << "destruktor Anjing...\n"; }
    Anjing (const Anjing & rhs);
    void Bicara()const { cout << "Guk Guk!\n"; }
    virtual Mammal* Klon() { return new Anjing(*this); }
};

Anjing::Anjing(const Anjing & rhs):
Mammal(rhs)
{
    cout << "konstruktor penyalin Anjing ...\n";
}

class Kucing : public Mammal
{
public:
     Kucing() { cout << "konstruktor Kucing...\n"; }
    ~Kucing() { cout << "destruktor Kucing...\n"; }
    Kucing (const Kucing &);
    void Bicara()const { cout << "Ngeonk Ngeonk!\n"; }
    virtual Mammal* Klon() { return new Kucing(*this); }
};

Kucing::Kucing(const Kucing & rhs):
Mammal(rhs)
{
    cout << "konstruktor penyalin Kucing ...\n";
}

enum BINATANG { MAMMAL, ANJING, KUCING};
const int JumJenisBinatang = 3;

int main()
{
    Mammal *arrayKu[JumJenisBinatang];
    Mammal* ptr;
    int pilihan, i;
    for ( i = 0; i<JumJenisBinatang; i++)
    {
        cout << "(1)anjing (2)kucing (3)Mammal: ";
        cin >> pilihan;
        switch (pilihan)
        {
            case ANJING: ptr = new Anjing;
                         break;
            case KUCING: ptr = new Kucing;
                         break;
            default: ptr = new Mammal;
                     break;
        }
        arrayKu[i] = ptr;
    }
    Mammal *arrayLain[JumJenisBinatang];

    for (i=0;i<JumJenisBinatang;i++)
    {
        arrayKu[i]->Bicara();
        arrayLain[i] = arrayKu[i]->Klon();
    }

    for (i=0;i<JumJenisBinatang;i++)
        arrayLain[i]->Bicara();

    getch();
    return 0;
}

(1)anjing (2)kucing (3)Mammal: 1
konstruktor Mammal...
konstruktor Anjing ...
(1)anjing (2)kucing (3)Mammal: 2
konstruktor Mammal...
konstruktor Kucing...
(1)anjing (2)kucing (3)Mammal: 3
konstruktor Mammal...
Guk Guk!
Konstruktor penyalin Mammal ...
konstruktor penyalin Anjing ...
Ngeonk Ngeonk!
Konstruktor penyalin Mammal ...
konstruktor penyalin Kucing ...
Mammal berbicara!
Konstruktor penyalin Mammal ...
Guk Guk!
Ngeonk Ngeonk!
Mammal berbicara!





No comments:

Post a Comment