Polimorfisme Statik
Elakkan lebihan panggilan maya
Polimorfisme Statik ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Dua Jenis Polimorfisme
C++ menyokong dua bentuk polimorfisme.
- Dinamik: fungsi maya diselesaikan pada masa jalan melalui jadual maya
- Statik: templat/CRTP diselesaikan pada masa kompilasi
Polimorfisme statik menukar fleksibiliti dengan kelajuan.
Kos Fungsi Maya
Panggilan maya memerlukan lompatan tidak langsung melalui jadual maya. Pengkompil biasanya tidak dapat menyisipkannya sebaris, lalu menghalang banyak pengoptimuman.
#include <iostream>
struct Shape {
virtual double area() const = 0;
virtual ~Shape() = default;
};
struct Square : Shape {
double s;
Square(double x) : s(x) {}
double area() const override { return s * s; }
};
int main() {
Shape* p = new Square(3);
std::cout << p->area() << "\n";
delete p;
return 0;
}Penghantaran Statik dengan CRTP
Dengan CRTP, kelas asas memanggil kaedah terbitan secara langsung melalui penukaran pada masa kompilasi, supaya pengkompil boleh menyisipkan semuanya sebaris.
#include <iostream>
template <typename T>
struct Shape {
double area() const { return static_cast<const T*>(this)->area(); }
};
struct Square : Shape<Square> {
double s;
Square(double x) : s(x) {}
double area() const { return s * s; }
};
int main() {
Square sq(3);
std::cout << sq.area() << "\n";
return 0;
}Penamaan Fungsi Penerus
Apabila kelas asas dan kelas terbitan kedua-duanya mentakrifkan area, berikan fungsi penerus kelas asas nama yang berbeza seperti compute supaya ia memanggil implementation kelas terbitan tanpa kekaburan.
#include <iostream>
template <typename T>
struct Shape {
double compute() const { return static_cast<const T*>(this)->area(); }
};
struct Circle : Shape<Circle> {
double r;
Circle(double x) : r(x) {}
double area() const { return 3.14159 * r * r; }
};
int main() {
Circle c(2);
std::cout << c.compute() << "\n";
return 0;
}Templat sebagai Polimorfisme Statik
Templat fungsi biasa juga merupakan polimorfisme statik: kod yang sama berfungsi untuk sebarang jenis yang menyediakan antara muka yang diperlukan (penaipan itik pada masa kompilasi).
#include <iostream>
struct Dog { void speak() const { std::cout << "Woof\n"; } };
struct Cat { void speak() const { std::cout << "Meow\n"; } };
template <typename Animal>
void make_speak(const Animal& a) { a.speak(); }
int main() {
make_speak(Dog{});
make_speak(Cat{});
return 0;
}Apabila Jenis Diketahui
Polimorfisme statik hanya terpakai apabila jenis konkrit diketahui pada masa kompilasi. Jika anda perlu menyimpan objek heterogen dalam satu bekas dan memilih tingkah laku pada masa jalan, anda masih memerlukan fungsi maya.
Tiada Bekas Heterogen
Anda tidak boleh meletakkan Shape<Square> dan Shape<Circle> dalam std::vector yang sama sebagai asas sepunya kerana kedua-duanya ialah jenis yang tidak berkaitan. Ini ialah batasan utama polimorfisme statik.
Manfaat Prestasi
Dengan menjadikan panggilan yang dihantar sebaris, pengkompil boleh melipat pemalar dan menghapuskan overhed panggilan fungsi sepenuhnya. Dalam gelung ketat yang beroperasi pada satu jenis yang diketahui, polimorfisme statik boleh menjadi jauh lebih pantas.
#include <iostream>
template <typename T>
struct Op {
int apply(int x) const { return static_cast<const T*>(this)->apply(x); }
};
struct Doubler : Op<Doubler> {
int apply(int x) const { return x * 2; }
};
int main() {
Doubler d;
int sum = 0;
for (int i = 0; i < 5; ++i) sum += d.apply(i);
std::cout << sum << "\n";
return 0;
}Menggabungkan Kedua-duanya
Anda boleh menggunakan CRTP untuk laluan panas dan pembalut maya yang nipis apabila pemadaman jenis diperlukan. Ini memberikan kelajuan pada bahagian yang penting dan fleksibiliti apabila diperlukan.
Semakan Antara Muka Statik
Jika kelas terbitan terlupa melaksanakan kaedah yang diperlukan, ralat akan muncul pada masa kompilasi apabila penghantar asas diwujudkan, bukannya pada masa jalan.
#include <iostream>
template <typename T>
struct Greeter {
void greet() const { static_cast<const T*>(this)->hello(); }
};
struct English : Greeter<English> {
void hello() const { std::cout << "Hello\n"; }
};
int main() {
English{}.greet();
return 0;
}Memilih Alat yang Tepat
Gunakan polimorfisme statik apabila:
- Jenis diketahui pada masa kompilasi
- Prestasi adalah kritikal
- Anda tidak memerlukan jenis asas sepunya pada masa jalan
Jika tidak, utamakan fungsi maya demi kejelasan dan fleksibiliti.
Semakan Pantas
Pilih pertukaran utama bagi polimorfisme statik.
Ulang Kaji
Anda telah membandingkan polimorfisme statik dan dinamik.
- Maya = penghantaran masa jalan, jadual fungsi maya, bekas heterogen
- CRTP/templat = penghantaran masa kompilasi, boleh dijadikan sebaris, lebih pantas
- Statik memerlukan jenis diketahui pada masa kompilasi
- Pilih berdasarkan keperluan fleksibiliti berbanding prestasi
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “Polimorfisme Statik” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “Polimorfisme Statik”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Polimorfisme Statik”?
Elakkan lebihan panggilan maya Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Polimorfisme Statik” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Idiom CRTP
- Polimorfisme Statik
- Mixin dengan CRTP
- Bila Menggunakan CRTP