Apakah salah menulis:
class A {
public:
virtual ~A() = 0;
};
untuk kelas dasar abstrak?
Setidaknya itu mengkompilasi di MSVC ... Apakah akan crash pada saat dijalankan?
Apakah salah menulis:
class A {
public:
virtual ~A() = 0;
};
untuk kelas dasar abstrak?
Setidaknya itu mengkompilasi di MSVC ... Apakah akan crash pada saat dijalankan?
Jawaban:
Iya. Anda juga perlu mengimplementasikan destructor:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
harus cukup.
Dan karena ini mendapat suara turun, saya harus mengklarifikasi: Jika Anda memperoleh sesuatu dari A dan kemudian mencoba untuk menghapus atau menghancurkannya, Adestructor akhirnya akan dipanggil. Karena murni dan tidak memiliki implementasi, perilaku yang tidak terdefinisi akan terjadi. Pada satu platform populer, itu akan memanggil purecall handler dan crash.
Sunting: memperbaiki deklarasi agar lebih selaras, dikompilasi dengan http://www.comeaucomputing.com/tryitout/
Penghancur pribadi: mereka akan memberi Anda kesalahan ketika Anda membuat objek dari kelas turunan - bukan sebaliknya. Diagnosis mungkin muncul.
12.4 Destructors
6 Destructor dapat dinyatakan virtual (10.3) atau virtual murni (10.4); jika ada objek dari kelas itu atau kelas turunan yang dibuat dalam program, destruktor harus didefinisikan.
Kelas dengan destruktor virtual murni adalah kelas abstrak. Catat dengan baik:
10.4 Kelas abstrak
2 Fungsi virtual murni hanya perlu didefinisikan jika dipanggil dengan, atau seolah-olah dengan (12.4), sintaks kualifikasi-id (5.1).
[ Catatan : deklarasi fungsi tidak bisa memberikan specifier murni dan definisi — catatan akhir]
Diambil langsung dari konsep:
struct C {
virtual void f() = 0 { }; // ill-formed
};