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, A
destructor 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
};