2013-01-31 31 views
13

Ben bir temel sınıf bazı ommitied kodla AçıkçasıC++ saf sanal işlevler olmadan soyut sınıf?

class ShapeF 
{ 
public: 
    ShapeF(); 
    virtual ~ShapeF(); 

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); } 

protected: 
    Vector2 mPosition; 
} 

var, ama noktası olsun. Ben bir şablon olarak kullanmak ve bazı eğlenceli (ommited) çeteleler ile, bir yol ı

class RotatedRectangleF : public ShapeF 
{ 
public: 
    RotatedRectangleF(); 
    virtual ~RotatedRectangleF(); 
protected: 
    float mWidth; 
    float mHeight; 
    float mRotation; 
} 

ShapeF konumlama ile işini yapar kullanarak ve ne tanımlayan bir enum ediyorum şekil türünü belirlemek için türü. Erişim sağlayıcıları ve mutators var, ancak hiçbir yöntem.

ShapeF nesnesinin bir nesnesini denemeden ve örneklememesini sağlamak için ShapeF'i soyut bir sınıf yapabilir miyim?

Normalde bu Ancak, Şu anda ayrı sınıfta çarpışmaları uğraşıyorum ShapeF

//ShapeF.h 
virtual void Collides(const ShapeF& inShape) = 0; 

içinde saf sanal fonksiyon alarak yapılabilir olduğunu. Her şeyi taşıyabilirim, ama saf bir sanal işlevler olmadan bir sınıf özeti oluşturmanın bir yolu olup olmadığını merak ediyorum.

+0

... gelecekte yakında ağrı olacak kullanmayı deneyin. Tasarımı tekrar gözden geçiririm. –

+0

@ DavidRodríguez-dribeas Bunun en kolay yaklaşım olduğunu düşündüm, static_casting her şey. Yeniden tasarım yapmak istesem, ShapeF() yi tümüyle, tüm polimorfizmle birlikte kaldırırdım ve her şekli kendi kişiliğidir. Farklı bir öneriniz olmadıkça? – MintyAnt

cevap

39

Sen beyan, ve, saf sanal yıkıcı uygulamak olabilir:

class ShapeF 
{ 
public: 
    virtual ~ShapeF() = 0; 
    ... 
}; 

ShapeF::~ShapeF() {} 

O zaten ne gelen minik adım ve doğrudan örneğinin oluşturulmasını ShapeF önleyecektir. Türetilmiş sınıfların değişmesi gerekmeyecek.

+3

Hızlı soru - 'ShapeF' niçin 'saf sanal' olarak ilan edildiğinde uygulanmalıdır? –

+0

Teşekkürler, bu mükemmel çalışıyor. Bunun neden işe yaradığı hakkında bir fikrin var mı? Saf bir sanal tanımlanamaz, diye düşündüm. – MintyAnt

+4

Tanımlanmalı veya türetilmiş sınıflar temel sınıflarını yok edemezler. Herhangi bir saf sanal işlev tanımlanabilir, bu da türetilmiş sınıfların bunlara temsilci olmasını sağlar. –

18

korumalı bir yapıcı Sen (enum) ve döküm etiketleme ile dinamik sevkini yeniden uygulamaya çalışıyoruz

+0

+1, yıkıcı 'korumalı' ve sanal olmayan olmalıdır. Eğer 'ShapeF'' 'new'-ed ve' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'problemi çözmeyen bir köşe dosyası vardır (fakat bu, kendi başına bir hatadır) –

+0

@ DavidRodríguez-dribeas Neden imhacı korunmalıdır? ? Korunuyorsa, nesneyi silemezsiniz. –

+0

@JamesKanze: Sanırım * biraz güçlü bir kelimedir. Yok edicinin "sanal" olmasının tek sebebi, * her zaman * türünün türetilmesi gerekirse yıkıcıyı sanal hale getirme tavsiyesini takip etmektir.Yıkıcıyı 'korumalı' yapmak, aynı temel sorunu çözer ve (en azından yığında ve yığında bellek sızıntılarından memnun olmadıkça) derleme sorununa bir çözüm sağlar. tasarım yeniden yorumlanmalı (soruya yorumda da belirttiğim gibi) –