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.