Bahasa C
Dalam tutorial ini, kita akan belajar tentang fungsi virtual C++ dan penggunaannya dengan bantuan contoh.
Fungsi virtual adalah fungsi anggota di kelas dasar yang ingin kita definisikan ulang di kelas turunan.
Pada dasarnya, fungsi virtual digunakan di kelas dasar untuk memastikan bahwa fungsi tersebut diganti . Ini terutama berlaku untuk kasus di mana pointer dari kelas dasar menunjuk ke objek dari kelas turunan.
Misalnya, perhatikan kode di bawah ini:
class Base {
public:
void print() {
// code
}
};
class Derived : public Base {
public:
void print() {
// code
}
};
Nanti, jika kita membuat pointer Base
ketik untuk menunjuk ke objek Derived
kelas dan panggil print()
fungsi, ia memanggil print()
fungsi Base
kelas.
Dengan kata lain, fungsi anggota Base
tidak diganti.
int main() {
Derived derived1;
Base* base1 = &derived1;
// calls function of Base class
base1->print();
return 0;
}
Untuk menghindari hal ini, kami mendeklarasikan print()
fungsi Base
kelas sebagai virtual dengan menggunakan virtual
kata kunci.
class Base {
public:
virtual void print() {
// code
}
};
Fungsi virtual merupakan bagian integral dari polimorfisme di C++. Untuk mempelajari lebih lanjut, lihat tutorial kami tentang Polimorfisme C++.
#include <iostream>
using namespace std;
class Base {
public:
virtual void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
// pointer of Base type that points to derived1
Base* base1 = &derived1;
// calls member function of Derived class
base1->print();
return 0;
}
Keluaran
Derived Function
Di sini, kami telah mendeklarasikan print()
fungsi Base
sebagai virtual
.
Jadi, fungsi ini ditimpa bahkan ketika kita menggunakan pointer Base
ketik yang menunjuk ke Derived
objek turunan1 .
C++ 11 telah memberi kita pengidentifikasi baru override
yang sangat berguna untuk menghindari bug saat menggunakan fungsi virtual.
Pengidentifikasi ini menetapkan fungsi anggota dari kelas turunan yang menggantikan fungsi anggota kelas dasar.
Misalnya,
class Base {
public:
virtual void print() {
// code
}
};
class Derived : public Base {
public:
void print() override {
// code
}
};
Jika kita menggunakan prototipe fungsi di Derived
class dan mendefinisikan fungsi tersebut di luar class, maka kita menggunakan kode berikut:
class Derived : public Base {
public:
// function prototype
void print() override;
};
// function definition
void Derived::print() {
// code
}
Saat menggunakan fungsi virtual, kemungkinan terjadi kesalahan saat mendeklarasikan fungsi anggota dari kelas turunan.
Menggunakan override
pengenal meminta kompiler untuk menampilkan pesan kesalahan ketika kesalahan ini dibuat.
Jika tidak, program hanya akan dikompilasi tetapi fungsi virtual tidak akan diganti.
Beberapa kemungkinan kesalahan ini adalah:
print()
, tetapi kami secara tidak sengaja menamai fungsi utama di kelas turunan sebagai pint()
.void
ketik tetapi fungsi di kelas turunan adalah int
ketik.
Misalkan kita memiliki kelas dasar Animal
dan kelas turunan Dog
dan Cat
.
Misalkan setiap kelas memiliki anggota data bernama type . Misalkan variabel ini diinisialisasi melalui konstruktor masing-masing.
class Animal {
private:
string type;
... .. ...
public:
Animal(): type("Animal") {}
... .. ...
};
class Dog : public Animal {
private:
string type;
... .. ...
public:
Animal(): type("Dog") {}
... .. ...
};
class Cat : public Animal {
private:
string type;
... .. ...
public:
Animal(): type("Cat") {}
... .. ...
};
Sekarang, misalkan program kita mengharuskan kita membuat dua public
fungsi untuk setiap kelas:
getType()
untuk mengembalikan nilai type print()
untuk mencetak nilai type Kita bisa membuat kedua fungsi ini di setiap kelas secara terpisah dan menimpanya, yang akan lama dan membosankan.
Atau kita bisa membuat getType()
virtual di Animal
kelas, lalu buat satu print()
. yang terpisah fungsi yang menerima pointer Animal
ketik sebagai argumennya. Kami kemudian dapat menggunakan fungsi tunggal ini untuk mengganti fungsi virtual.
class Animal {
... .. ...
public:
... .. ...
virtual string getType {...}
};
... .. ...
... .. ...
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
Ini akan membuat kode lebih pendek , pembersih , dan kurang berulang .
// C++ program to demonstrate the use of virtual function
#include <iostream>
#include <string>
using namespace std;
class Animal {
private:
string type;
public:
// constructor to initialize type
Animal() : type("Animal") {}
// declare virtual function
virtual string getType() {
return type;
}
};
class Dog : public Animal {
private:
string type;
public:
// constructor to initialize type
Dog() : type("Dog") {}
string getType() override {
return type;
}
};
class Cat : public Animal {
private:
string type;
public:
// constructor to initialize type
Cat() : type("Cat") {}
string getType() override {
return type;
}
};
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
int main() {
Animal* animal1 = new Animal();
Animal* dog1 = new Dog();
Animal* cat1 = new Cat();
print(animal1);
print(dog1);
print(cat1);
return 0;
}
Keluaran
Animal: Animal Animal: Dog Animal: Cat
Di sini, kami telah menggunakan fungsi virtual getType()
dan Animal
penunjuk ani untuk menghindari pengulangan print()
fungsi di setiap kelas.
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
Di main()
, kami telah membuat 3 Animal
pointer untuk membuat objek Animal
secara dinamis , Dog
dan Cat
kelas.
// dynamically create objects using Animal pointers
Animal* animal1 = new Animal();
Animal* dog1 = new Dog();
Animal* cat1 = new Cat();
Kami kemudian memanggil print()
fungsi menggunakan pointer ini:
print(animal1)
dipanggil, pointer menunjuk ke Animal
obyek. Jadi, fungsi virtual di Animal
kelas dieksekusi di dalam print()
.print(dog1)
dipanggil, pointer menunjuk ke Dog
obyek. Jadi, fungsi virtual diganti dan fungsi Dog
dieksekusi di dalam print()
.print(cat1)
dipanggil, pointer menunjuk ke Cat
obyek. Jadi, fungsi virtual diganti dan fungsi Cat
dieksekusi di dalam print()
.Bahasa C
C Fungsi yang ditentukan pengguna Dalam tutorial ini, Anda akan belajar membuat fungsi yang ditentukan pengguna dalam pemrograman C dengan bantuan sebuah contoh. Fungsi adalah blok kode yang melakukan tugas tertentu. C memungkinkan Anda untuk mendefinisikan fungsi sesuai dengan kebutuhan Anda. Fun
Fungsi Python Dalam artikel ini, Anda akan mempelajari tentang fungsi, apa itu fungsi, sintaks, komponen, dan jenis fungsi. Selain itu, Anda akan belajar membuat fungsi dengan Python. Video:Pengenalan Fungsi Python Apa itu fungsi dalam Python? Dalam Python, fungsi adalah sekelompok pernyataan ter
Apa itu Kelas? Kelas C++ menggabungkan data dan metode untuk memanipulasi data menjadi satu. Kelas juga menentukan bentuk objek. Data dan metode yang terkandung dalam sebuah kelas dikenal sebagai anggota kelas. Kelas adalah tipe data yang ditentukan pengguna. Untuk mengakses anggota kelas, kami men
Apa itu Polimorfisme dalam C++? Dalam C++, polimorfisme menyebabkan fungsi anggota berperilaku berbeda berdasarkan objek yang memanggil/memanggilnya. Polimorfisme adalah kata Yunani yang berarti memiliki banyak bentuk. Itu terjadi ketika Anda memiliki hierarki kelas yang terkait melalui pewarisan.