|
| nedarvning og tilførsel af const til argum~ Fra : Per Abrahamsen |
Dato : 11-03-04 10:53 |
|
Er følgende legalt?
struct base
{
virtual void f (int) = 0;
};
struct derived
{
void f (const int);
};
derived instance; // Er derived komplet?
Spørgsmålet er om derived::f er en implementation af base::f, eller om
det er en ny, urelateret funktion på grund af "const".
GCC, Intel og Borland siger de to funktioner er ens. Visual C++ 2003
siger det er en ny funktion, men er flink nok til at give en meget
eksplicit advarsel før den brokker sig over at "derived" er ukomplet.
| |
Ivan Johansen (11-03-2004)
| Kommentar Fra : Ivan Johansen |
Dato : 11-03-04 12:54 |
|
Per Abrahamsen wrote:
> struct base
> {
> virtual void f (int) = 0;
> };
>
> struct derived
> {
> void f (const int);
> };
>
> derived instance; // Er derived komplet?
>
> Spørgsmålet er om derived::f er en implementation af base::f, eller om
> det er en ny, urelateret funktion på grund af "const".
derived::f overskriver korrekt base::f. Generelt er følgende to
deklarationer det samme:
void g(int);
void g(const int);
const ignoreres i deklarationer da det kun har betydning for
definitionen. For den som kalder funktionen er det ligegyldigt om
funktionen ændrer på den kopi den får.
Ivan Johansen
| |
Mogens Hansen (11-03-2004)
| Kommentar Fra : Mogens Hansen |
Dato : 11-03-04 20:49 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote:
[8<8<8]
> Spørgsmålet er om derived::f er en implementation af base::f, eller om
> det er en ny, urelateret funktion på grund af "const".
C++ Standarden siger:
§10.3-2
If a virtual member function vf is declared in a class Base and in a class
Derived, derived directly or indirectly from Base, a member function vf
with the same name and same parameter list as Base::vf is declared, then
Derived::vf is also virtual (whether or not it is so declared) and it
overrides97) Base::vf.
97) A function with the same name but a different parameter list (clause 13)
as a virtual function is not necessarily virtual and does not override. The
use of the virtual specifier in the declaration of an overriding function
is legal but redundant (has empty semantics).
§13.1-3
Parameter declarations that differ only in the presence or absence of const
and/or volatile are equivalent. That is, the const and volatile
typespecifiers for each parameter type are ignored when determining which
function is being declared, defined, or called.
>
> GCC, Intel og Borland siger de to funktioner er ens.
Comeau, som normalt er en god reference, siger det samme.
Intel og Comeau bruger begge EDG front-enden.
> Visual C++ 2003
> siger det er en ny funktion, men er flink nok til at give en meget
> eksplicit advarsel før den brokker sig over at "derived" er ukompl
Spørgsmålet er vel om "same parameter list" i §10.3-2 er eksakt det samme
som "Parameter declarations ... are equivalent" i §13.1-3. Jeg opfatter det
som det samme (ikke mindst pga. af henvisningen fra §10 til §13), og derfor
forekommer mig at gcc, Intel, Comeau og Borland har ret og Microsoft tager
fejl.
Under alle omstændigheder ville jeg prøve at undgå situationen - men det er
en anden sag.
Venlig hilsen
Mogens Hansen
| |
Per Abrahamsen (12-03-2004)
| Kommentar Fra : Per Abrahamsen |
Dato : 12-03-04 10:09 |
|
Mogens Hansen <mogens_h@dk-online.dk> writes:
> Spørgsmålet er vel om "same parameter list" i §10.3-2 er eksakt det samme
> som "Parameter declarations ... are equivalent" i §13.1-3. Jeg opfatter det
> som det samme (ikke mindst pga. af henvisningen fra §10 til §13), og derfor
> forekommer mig at gcc, Intel, Comeau og Borland har ret og Microsoft tager
> fejl.
Jeg syntes den citerede tekst gør det helt klart at Microsoft tager
fejl. Det undrer mig så bare at compileren giver en så eksplicit
advarsel. Måske ved de det er en fejl, men i stedet for at rette den
giver de en advarsel?
> Under alle omstændigheder ville jeg prøve at undgå situationen - men det er
> en anden sag.
Det er rart at kunne tilføje "const" på value parametre i konkrete
klasser, hvis man ikke agter at ændre på dem. Men det komme ikke
rigtig interface klassen ved.
Man kan så tilføje det i definitionen, og undlade det i erklæringen.
Men små funktioner i konkrete klasser definerer jeg ofte inline i
klassen, det er lettere at overskue på den måde. De konkrete klasser
ligger i C filer, skabes gennem et "factory", og kan ellers kun tilgås
af resten af systemet gennem interface klassen. Så de sædvanlige
argumenter for at adskille erklæring og definition gælder ikke.
| |
|
|