In questo contesto, l'avvertimento che una funzione è nascosta ci fa sapere che una funzione membro nella classe derivata ha lo stesso nome, ma una firma diversa rispetto a una funzione nella classe base. Considerate:
struct Base
{
void foo(int) {}
void bar(int) {}
};
struct Derived: Base
{
void bar(int, int) {}
};
int main()
{
Derived d;
d.foo(1);
d.bar(1); // will not compile: Base::bar is hidden by Derived::bar
}
In questo esempio, l'intenzione potrebbe essere stato per aggiungere una funzione aggiuntiva denominata "barra", ma il risultato è che il compilatore si ferma alla ricerca di nuovi ambiti con nome funzioni bar una volta che trova un ambito con un funzione chiamata bar. Quindi bar (int) è nascosto da bar (int, int) (o qualsiasi altra barra con una firma non corrispondente). (O nel caso non virtuale, anche se le funzioni corrispondono.)
In questo codice di Graznarak, Base :: Func è nascosto in qualsiasi situazione in cui Derivato viene istanziato per qualsiasi valore di T che non è float (o float const).
Graznarak chiede il comportamento corretto. Il precedente corretto per il codice generato non è in questione Derived :: Func() è chiamato.
Ma questo lascia la domanda: l'avviso è corretto. Lo standard non ha risposta. Non esprime mai un'opinione sull'opportunità di generare un avviso. Se mettere in guardia o meno su un particolare problema è sempre soggettivo e i compilatori possono distinguersi mostrando un buon giudizio a riguardo.
Quindi il compilatore dovrebbe avvisare di questa situazione? Arguable, il codice come scritto fa ciò che è probabilmente inteso. Ma l'esistenza di un modello implica che verrà istanziata su più di un tipo (altrimenti perché creare un modello) e per qualsiasi altro tipo, occorrerebbe nascondersi. Quindi si potrebbe sostenere che l'avviso dovrebbe essere dato con la creazione del modello derivato. Ma si potrebbe anche sostenere che l'avviso non dovrebbe accadere fino a quando non viene specificata un'istanza di tipo non float.
Discutere per il primo è che l'avviso sarebbe precedente e probabilmente rilevato dal programmatore che scrive il codice problematico. Discutere per il dopo è che finché un tipo non-float viene istanziato, non esiste alcuna situazione sospetta su cui essere avvisati.
fonte
2015-04-13 21:51:29
Cosa c'è di sbagliato con un avviso sul codice valido che potrebbe non fare ciò che ci si aspetta? Ad esempio, 'if (b = true)' causerebbe di solito un avvertimento. – chris
Non penso che dovrebbe produrre un avvertimento - non c'è niente di sbagliato nel codice. Non ho mai visto questo tipo di cose (una classe derivata che utilizza la funzione basata su modelli), mi ha fatto riflettere (oou) – pm100
Ho la sensazione che in realtà nasconda la funzione in Base perché se provi a farlo: Base * b = nuovo Derivato(); nel tuo main ti darà l'errore di compilazione: errore C2259: 'Derivato ': impossibile istanziare la classe astratta 1> a causa dei seguenti membri: 1> 'void Base :: Func (float)': è astratto Quindi mi sembra strano. –
RedOctober