her sınıf sanal yıkıcı olmalı mı?

oy
45

Java ve C # ile temel sınıflar olarak kullanılamaz sınıfları kavramını destekleyen finalve sealedanahtar kelimeler. C ++ ancak hangi bir ikilem ile sınıfının yazarı bırakır türetilmiş olmaktan sınıfını önlemek için iyi bir yol yoktur, her sınıf sanal yıkıcı ya olmamalıdır?


Düzenleme: C ++ 11 Bu artık doğru olduğundan, bir sınıf olduğunu belirtebilirsiniz final.


Bir nesne veren bir yandan sanal yıkıcı bir olacağı anlamına gelir vtableve bu nedenle de (64 bitlik makinelerde ya da 8) 4 tüketmek için ek bayt başına nesne vptr.

Biri, daha sonra bu sınıfından türetilmiş ve (nedeniyle sanal yıkıcı yokluğu) programı kötü tanımlanacak temel sınıf bir işaretçi ile türetilmiş bir sınıf siler ve amacı başına Açıkçası bir işaretçi için optimize Öte yandan gülünç.

On kavrama yandan sanal yıkıcı olan (belki) bu tip polymorphically kullanılacak amaçlı olduğunu tanıtır.

Bazı insanlar (alt metni olduğu gibi sanal yıkıcı kullanmayan için açık bir nedene ihtiyacım düşünüyorum bu soruya ) ve diğerleri ne, size sınıf elde edilecek olduğuna inanmak için nedenlerimiz var sadece bunları kullanması gerektiğini söylemek sana sence?

Oluştur 09/12/2008 saat 19:56
kaynak kullanıcı
Diğer dillerde...                            


8 cevaplar

oy
53

Her soyut sınıf bir olmalı, ya

  • yıkıcı korumalı veya
  • Sanal yıkıcı.

Bir ortak olmayan sanal yıkıcı var ise kullanıcıların ilgili işaretçi Türetilmiş nesnesi aracılığıyla silmenizi sağlar, çünkü bu, hiç iyi değil. hepimizin bildiği gibi bu yana, yani tanımsız davranış.

Değil buna bir işaretçi üzerinden silmek için tasarlanmış bir sınıf için, sanal yıkıcı olması hiçbir neden yoktur. Sadece kaynak israf olmaz, ama daha da önemlisi kullanıcılara yanlış ipucu verecekti. Sadece berbat anlamda onu vermek kılacak düşün std::iteratorsanal yıkıcı.

Cevap 09/12/2008 saat 20:06
kaynak kullanıcı

oy
26

Soru istiyorsun, gerçekten zorlamak dersleriniz nasıl kullanılması gerektiği ile ilgili kuralları? Niye ya? Bir sınıf sanal yıkıcı yoksa, sınıfını kullanan kişilerin elde edilecek tasarlanmamıştır olduğunu bilir ve yine de deneyin neyi sınırlamalar uygulanır. Yeterince iyi değil mi?

Yoksa kimse eğer sert bir hata atmasına derleyici gerekiyor cesaret sen beklemedikleri bir şey yapmak?

sınıf insanlar ondan türetmek için size niyetinde olmadığını sanal yıkıcı verin. Aksi takdirde yok, ve kodunuzu kullanan kişilerin doğru kodu kullanmak kadar zeki olduğunu varsayalım.

Cevap 09/12/2008 saat 20:18
kaynak kullanıcı

oy
8

Yok hayır! türetilmiş bir sınıf bir amacı, bir temel sınıf işaretçi silinir yalnızca sanal yıkıcılar kullanılır. Sınıf bu senaryoda üs olarak hizmet amaçlanmıştır değilse, yıkıcı sanal yapmayın - Yanlış bir mesaj göndererek olacaktır.

Cevap 09/12/2008 saat 20:04
kaynak kullanıcı

oy
4

Kontrol Herb Sutter bu makaleyi :

Yönerge # 4: Bir temel sınıf yıkıcı kamu ve sanal veya korunan ve nonvirtual ya olmalıdır.

Cevap 10/12/2008 saat 14:08
kaynak kullanıcı

oy
2

Ben genel soruya "hayır" olur. Değil her sınıf bir ihtiyacı var. Sınıf miras asla biliyorum, o zaman küçük yükü tabi gerek yoktur. Bir şans var Ama eğer, güvenli tarafta olmak ve orada bir tane koyun.

Cevap 09/12/2008 saat 19:58
kaynak kullanıcı

oy
0

en az bir saf sanal fonksiyon içerdiğinde Taban sınıfı, soyut bir sınıf haline gelir. Baz, o zaman güvenli bir şekilde Türetilmiş nesne işaretçi üzerinden ancak bir Baz nesne işaretçi üzerinden bir Türetilmiş nesne yok edebilir gelmez sanal yıkıcı ve Türetilmiş (Base türetilmiş) etmezse.

Cevap 12/05/2010 saat 21:04
kaynak kullanıcı

oy
0

Ben Üst veya alt sınıfta sanal unuttum çağrılan almıyorum yıkıcılar üzerinde bir süre kafamı çizik var olduğu zamanlar olmuştur ekleyeceğiz. Ben şimdi olsa o aramaya biliyoruz. :)

Birisi üst sınıf bir çocuğun yapmaması gereken onun yıkıcı bir şey yapar zamanlar olduğunu iddia edebilir ... Ama sonuçta O muhtemelen miras yapısı ile yanlış bir şey göstergesidir.

Cevap 09/12/2008 saat 20:14
kaynak kullanıcı

oy
-3
include<iostream> using namespace std;

class base {
    public: base() {
        cout << "In base class constructor" << endl;
    }

    virtual ~base() {
        cout << "in base class destuctor" << endl;
    }
};

class derived : public base {
    public: derived() {
        cout << "in derived class constructor" << endl;
    }

    ~derived() {
        cout << "in derived class destructor" << endl;
    }
};

int main() {
    base *b; // pointer to the base
    class b = new derived; // creating the derived class object using new
    keyword;
    delete b;
    return 0;
}
Cevap 01/01/2016 saat 13:52
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more