2011-07-28 16 views
32

Birçok arabirimi uygulayan oldukça büyük bir nesneyi uygulamaya çalışıyorum. Bu arayüzlerden bazıları saf sanal. Elmas mirasta bir sorunum olabilir. Visual Studio, C4250 ('class1' : inherits 'class2::member' via dominance) uyarısını bildiriyor. Öncelikle bu sınıflar olması gerektiği gibi miras alınır. Aşağıdaki, bu soruna neden olan kısmi sınıf tasarımdır.C++ Baskınlık uyarısı yoluyla miras alın

A  B  C 
\ /\ /
    \ / \ /
    AB  BC 
    |   | 
    |  BC2 
    |   | 
    \  D: Implementation of B, C, BC, BC2 
     \ /
     Big 

Bu ağacın yalnızca D'sinde sanal yöntemler uygulanır, söz konusu yöntemin başka bir tanımı yoktur. Ve tüm B sanal yöntemleri uyarılarda listelenir. Önemliyse, D tam bir sınıftır.

Bunu, Boost serileştirme ile yapıldığını okudum ve uyarıyı göz ardı etmek güvenlidir.

Bu yöntem geçerli olmaya çalışıyorum mı? Bu uyarıyı dikkate almak güvenli mi?

Not 1: Bu, Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance) kopyası değil, orada önerilen çözümü denedim.

Not 2: Ayrıca sınıf şemasını gönderebilirim ama bundan biraz daha karmaşık.

DÜZENLEME:

warning C4250: 'gge::resource::ImageResource' : inherits 
'gge::graphics::ImageTexture::gge::graphics::ImageTexture::drawin' 
via dominance 

gge::resource::ImageResource çizimde büyük olduğu, gge::graphics::ImageTexture D drawin ı uyarı olsun altı yöntemlerden biri aşağıdaki gibidir: Tam uyarıdır.

+0

Birçok arabirim uygulamak, sınıfınızın çok fazla sorumluluğu olabileceğinin bir işaretidir. Bunu birkaç küçük sınıfa geri almayı düşünün. – hammar

+0

@hammar: Denedim ama sorun sınıfla ilgili değil, Big sadece bir görüntü ancak birçok farklı grafik tipini destekleyen birçok arayüz var. Belirli bir arabirimin hizmetlerini gerektiren işlevler, ihtiyaçlarını karşılayan en küçük arabirimi kullanmalıdır. Bir örnek olarak, bu özellikleri kullanarak, bir parçacık sistemini fare işaretçisi olarak değiştirebilirim. Kısacası daha küçük sınıflara giremedim. –

+1

Alt sınıflamaya alternatif olarak Dekorasyon desenini (http://en.wikipedia.org/wiki/Decorator_pattern) göz önünde bulundurun. –

cevap

16

Her şey kesinlikle geçerlidir. Bir derleyicinin geçerli bir kod hakkında uyarmasına izin verilir, burada sorun yok. Uyarıyı bir using bildirimi ile susturmayı deneyebilirsiniz. Bu işe yaramazsa (muhtemelen bir MSVC hatası nedeniyle), bir pragma ile susturun.

+0

Çalışıyorsa, soruyu sormayacağım, pragma hile yapmalıdır. Cevap için teşekkürler. –

+0

Bazı dosyalarda 'using' kaynak dosyadaki önemli olmayan boşluklara bağlı olarak çalışıyor veya başarısız oluyor. Eğer doğruysa, kesinlikle orada bir derleyici hatası var. –

+0

Lütfen kullanma beyanının kodunu gösteriniz. –