Yazmak yanlış mı?
class A {
public:
virtual ~A() = 0;
};
soyut bir temel sınıf için?
En azından MSVC'de derleniyor ... Çalışma zamanında çökecek mi?
Yazmak yanlış mı?
class A {
public:
virtual ~A() = 0;
};
soyut bir temel sınıf için?
En azından MSVC'de derleniyor ... Çalışma zamanında çökecek mi?
Yanıtlar:
Evet. Yıkıcıyı da uygulamanız gerekir:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
yeterli olmalı.
Ve bu bir aşağı oy aldığından, açıklığa kavuşturmalıyım: A'dan bir şey türetir ve sonra onu silmeye veya yok etmeye çalışırsanız A
, sonunda yıkıcısı çağrılır. Saf olduğu ve bir uygulaması olmadığı için tanımlanmamış davranış ortaya çıkacaktır. Popüler bir platformda, bu safkan işleyicisini ve çökmesini çağırır.
Düzenleme: bildirimi http://www.comeaucomputing.com/tryitout/ ile derlenmiş şekilde daha uyumlu olacak şekilde düzeltme
Özel yıkıcılar: türetilmiş bir sınıfın nesnesini oluşturduğunuzda size bir hata verecektir - aksi halde değil. Yine de bir teşhis görünebilir.
12.4 Yıkıcılar
Bir yıkıcı sanal (10.3) veya saf sanal (10.4) olarak tanımlanabilir; programda o sınıftan herhangi bir nesne veya türetilmiş sınıf oluşturulmuşsa, yıkıcı tanımlanır.
Saf sanal yıkıcıya sahip bir sınıf soyut bir sınıftır. İyi not:
10.4 Soyut sınıflar
2 Saf sanal işlev yalnızca nitelikli kimlik sözdizimi (5.1) ile çağrıldığında veya (12.4) ile tanımlanmışsa tanımlanmalıdır.
[ Not : işlev bildirimi hem salt belirleyici hem de tanım sağlayamaz - son not]
Doğrudan taslaktan alınmıştır:
struct C {
virtual void f() = 0 { }; // ill-formed
};