2011-07-28 14 views
32

Sto cercando di implementare un oggetto piuttosto grande che implementa molte interfacce. Alcune di queste interfacce sono pure virtuali. Potrei avere un problema nell'ereditarietà del diamante. Visual Studio sta segnalando un avviso di C4250 ('class1' : inherits 'class2::member' via dominance). Prima di tutto queste classi sono ereditate virtualmente come dovrebbe essere. Di seguito è riportato il progetto di classe parziale che causa questo problema.Ereditarietà C++ tramite avviso di posizione dominante

In questo intero albero solo D implementa metodi virtuali, non esiste altra definizione del metodo in questione. E tutti i metodi virtuali di B sono elencati negli avvisi. Se importante, D è una classe completa.

Ho letto questo succede con la serializzazione Boost ed è sicuro ignorare l'avviso.

È questo metodo che sto cercando di ottenere valido? È sicuro ignorare questo avvertimento?

Nota 1: Questo non è un duplicato di Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance), ho provato la soluzione proposta lì.

Nota 2: Posso anche inviare diagrammi di classe, ma è un po 'più complicato di questo.

EDIT: avvertimento completa è la seguente:

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

gge::resource::ImageResource è grande nel disegno, gge::graphics::ImageTexture è D, drawin è uno dei sei metodi vengo avvertimento per.

+0

L'implementazione di molte interfacce è un segnale che la tua classe potrebbe avere troppe responsabilità. Considerare il refactoring in diverse classi più piccole. – hammar

+0

@hammar: Ho provato ma il problema non riguarda la classe, Big è solo un'immagine ma ci sono molte interfacce per supportare molti tipi diversi di grafica. Le funzioni che richiedono i servizi di un'interfaccia specifica dovrebbero utilizzare l'interfaccia più piccola che soddisfi le loro esigenze. Come esempio, usando queste proprietà, posso sostituire un sistema di particelle come un puntatore del mouse. In breve, non potevo entrare in classi più piccole. –

+1

Considerare il modello di decorazione (http://en.wikipedia.org/wiki/Decorator_pattern) come alternativa alla sottoclasse. –

risposta

16

Tutto è assolutamente valido. Un compilatore è autorizzato ad avvertire sul codice valido, nessun problema qui. Puoi provare a disattivare l'avviso con una dichiarazione using. Se questo non funziona (probabilmente a causa di un bug di MSVC), silenziarlo con un pragma.

+0

Se l'utilizzo stava funzionando, non avrei fatto la domanda, il pragma dovrebbe fare il trucco. Grazie per la risposta. –

+0

Ho sentito che per alcune persone 'using' funziona o fallisce a seconda degli spazi bianchi non significativi nel file sorgente. Se è vero, c'è sicuramente un bug del compilatore lì. –

+0

Si prega di mostrare il codice per la dichiarazione d'uso. –