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
};