2007-01-20

NULL

Dagboksvarning! Nördvarning!

Tidigare under veckan blev jag tvungen att kolla upp lite hur det går till när man anropar metoder i C++. I det konkreta fallet gällde följande: Klass2 ärver från Klass1 och överlagrar den icke-virtuella Metod(). Vilken metod anropas om du har ett objekt med typ Klass1, castar det till Klass2 och anropar Metod()?

Tänker man efter lite så inser man att det är Metod() i Klass2 som anropas. Ingenting konstigt händer vid anrop av icke-virtuella metoder. Kompilatorn avgör vilken typ det aktuella objektet har och hoppar till den klassens metod. Det är precis som ett funktionsanrop i C, förutom att det första argumentet som skickas in är this-pekaren. Eftersom vi har castat vårt objekt så har det typ Klass2, och kompilatorn genererar en jump to subroutine till Klass2's Metod().

Den roliga konsekvensen av detta är att följande kod fungerar alldeles utmärkt:

Klass2 *k = NULL;
k->Metod();

Förutsättningen är att Metod() inte gör något meningsfullt, men om den inte läser eller skriver någon data i objektet så fungerar det alldeles utmärkt, eftersom det konkreta objektet inte behöver blandas in. I Metod() kommer this vara NULL.

8 kommentarer:

Anonym sa...

Du kan alltså skapa klassmetoder genom det där förfarandet. Skulle det fungera likadant om du skickade in en pekare som inte var satt till NULL?

I Objective-C leder ett anrop till NULL inte till något alls, så det är standard att inte kolla efter nullpekare. En del gillar det, andra inte.

puterman sa...

Poängen är bara att objektet inte är inblandat på något sätt när man letar upp metoden att anropa. Vad pekaren är satt till spelar ingen roll.

Men vad händer om man anropar en metod som inte finns i Objective C? Returneras ett felvärde?

Anonym sa...

Du tror jag ljüger, men man får en SIGTRAP.

puterman sa...

Bara lamers får SIGTRAP!

PS. Hur gör man ett fullskärmsraster? DS.

jimmyroq sa...

Jag undrar vad Monika Danielsson skulle säga om att du tänker i C++? Och kan man inte ens få en varning för sådant där förfarande med någon vettig kompilator?

/yobhikgd

ul7 sa...

wv: von_SIGTRAPP_family_singers

puterman sa...

- Monika, kan man inte tänka i C++?
- Det vill du inte!

ul7 sa...

- Ok