C ++ 'ta saf sanal yıkıcı


Yanıtlar:


218

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


16
Um, evet öyle. Saf yalnızca türetilmiş bir sınıfın da bir uygulama sağlaması gerektiği anlamına gelir.
MSN

72
Saf sanal işlevlerin uygulanması aslında yasaldır. Varsayılan bir uygulama sağlamak için çok yararlıdır, ancak alt sınıfları açıkça çağırmaya zorlar.
jmucchiello

6
MSN ve başlıkta bu tanım varsa, ODR'yi (bir tanım kuralı) ihlal etmekten kaçınmak için önce "satır içi" koymanız gerektiğini unutmayın
Johannes Schaub - litb

2
Neden her nesne için varsayılan bir yıkıcı olduğunu düşündüğüm için A :: ~ A () açıkça tanımlanmalıdır? Her tür mirasta olduğu gibi, yıkıcı zinciri her zaman çağrılır ve temel sınıf yıkıcısının her zaman tanımlanması gerekmez.
jeffD

11
Daha iyi bir yol, bir yıkıcı ilan ettikten sonra, sizin için otomatik olarak uygulanmadığıdır.
MSN

49

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

14
+1. Herb Sutter'in de bu konuda bazı iyi bilgileri olduğunu düşünüyorum: gotw.ca/gotw/031.htm . Herhangi bir saf sanal fonksiyonun sadece yıkıcılar değil, bir uygulama da olabileceğini belirtmek ilginç.
Fred Larson

6
Evet, röportaj yapanları korkutmak için bir röportajda yaptığınız bir şey;)
dirkgently

1
Benim deneyimime göre bu pek de nadir değil.

@Neil Butterworth: Hangisi?
dirkgently

@Dirk - "herhangi bir işlev" senaryosu. Bazı ortak davranışları uygulamak için kullanıldığını bulmak nadir değildir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.