Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

"Nevidljivost" funkcije osnovne klase

[es] :: C/C++ programiranje :: "Nevidljivost" funkcije osnovne klase

[ Pregleda: 3198 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

PeraPisar

Član broj: 35583
Poruke: 15
212.62.55.*



Profil

icon "Nevidljivost" funkcije osnovne klase12.05.2005. u 00:26 - pre 200 meseci
Kod je sledeci:
Code:
class A
{
public:
    void F() { this->F(3); };
    virtual void F(int a) = 0;
};

class B: public A
{
public:
    virtual void F(int a) { printf("%d\n", a); };
};

void main()
{
    B b;

    b.F();
}


I po nekom mom rezonovanju klasa B bi trebalo da nasledi funkciju F() svoje osnovne klase A. Medjutim, kompajliranje (MS VC++ 7) ne prodje sa porukom da B nema deklarisanu funkciju F koja prima 0 argumenata.
Da li neko ima neko logicno objasnjenje zbog cega se ovo desava?

Hvala!
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4889
*.ptt.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 09:27 - pre 200 meseci
Code:

b.F();


pod pretpostavkom da je ono sto si naveo kao gresku tacno,
probaj na primer:

Code:

b.A::F(); // <-- ovo bi trebalo da razresi konflikt 'A::'
b.F(50); // <-- ovo treba da bude OK


 
Odgovor na temu

PeraPisar

Član broj: 35583
Poruke: 15
212.62.55.*



Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 13:41 - pre 200 meseci
nisam probao, ali pretpostavljam da bi proslo. Jedino mi ne ide u glavu zbog cega izvedena klasa ne moze da pozove javnu funkciju svoje osnovne klase? Ovo na primer prolazi:
Code:
A *pB = new B();
pB->F();


a ovo ne:
Code:
B *pB = new B();
pB->F();
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4889
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 15:10 - pre 200 meseci
Citat:

Jedino mi ne ide u glavu zbog cega izvedena klasa ne moze
da pozove javnu funkciju svoje osnovne klase?

Zato sto funkciju F() imas i kao svoju i kao virtuelnu:
Code:

void F() { this->F(3); };
virtual void F(int a) = 0;

Zameni kod tako da izgleda:
Code:

void FMoje() { this->F(3); };
virtual void F(int a) = 0;

... i tada pretpostavljam da neces imati vise problema sa:
Code:

b.FMoje();
b.F(50);


Zbog cega je tako - ne znam, ali sigurno ima neko logicno objasnjenje;
ipak su oko kompajlera angazovani ljudi koji daleko bolje poznaju stvari
nego mi, slazes se? ;)

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1236



+93 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 16:46 - pre 200 meseci
Ovo treba neko da proveri na nekom drugom kompajleru, tek tada cemo

znati je li bug ili to tako treba...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4889
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 17:53 - pre 200 meseci
Evo, probao sam i isto je kod Borland C++ Builder-a... buni se ;)
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 21:36 - pre 200 meseci
Naravno da se buni, to je sasvim u redu.

Preporuchio bih da nadjete "C++ standard" ili, josh bolje, knjigu Herb Sutter-a "Exceptional C++".
U knjizi je detaljno objashnjen princip Name Lookup-a, kao i Koenig-ov princip razreshenja imena/poziva, odnosno standardni nachin na koji kompajler odluchuje koju funkciju da pozove. Sve to ispisati u jednom postu je previshe, zato knjigu u shake! :)


PS
Obe knjige iz Exceptional C++ serije su MUST READ!
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.dyn.optonline.net.



+6 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 21:53 - pre 200 meseci
Opet plašiš početnike, nevaljali dečače ;)

Ovo nema veze sa ADL-om iliti Koenig-ovim lookupom, a mislim da ne postoji živ čovek koji napamet zna sva pravila razrešenja imena u C++u.

 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: "Nevidljivost" funkcije osnovne klase12.05.2005. u 22:14 - pre 200 meseci
Citat:
Dragi Tata: Opet plašiš početnike, nevaljali dečače ;)

Ovo nema veze sa ADL-om iliti Koenig-ovim lookupom, a mislim da ne postoji živ čovek koji napamet zna sva pravila razrešenja imena u C++u.


Tjale, tjale... :)
Pa znash i sam da je odgovor na ovo pitanje u Name lookup-u/hiding-u... to shto je Sutter u 4 poglavlja ubacio i Koenig-a nije moja krivica :)

Evo izvoda iz knjige koji objasnjava princip :

Citat:
In short, when we declare a function named g in the derived class, it automatically hides all functions with the same name in all direct and indirect base classes


Nadam se da ovo pojashnjava gore navedeni problem.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.dyn.optonline.net.



+6 Profil

icon Re: "Nevidljivost" funkcije osnovne klase13.05.2005. u 00:22 - pre 200 meseci
Još gore, strpao je sve to u jedan članak:

http://www.gotw.ca/publications/mill08.htm


 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4889
*.ptt.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: "Nevidljivost" funkcije osnovne klase13.05.2005. u 10:43 - pre 200 meseci
Kad se nešto ne zna, onda se pita...

Reče mi jedan čo'jek:

Citat:

Because C++ name lookup works that way. It only starts looking into
an outer scope if the current scope does not find the name. This is
true of base classes as well. Since your derived class does indeed
offer the name F, the language only looks in your derived class and
only considers the names it found there. THEN, of all the names found
in the places it looked, does it attempt to do overload resolution.

In your case, the set of names is 1, and so overload resolution is
trivial.

Two things to think about:

1) it's generally a bad idea to overload virtual functions

2) in your derived class declaration, if you say "using A::F;" it'll
consider names in the base class at the same time it considers
names in the derived class. (Which should solve the problem in
this case.)

While #2 above should fix the problem, I still suggest you adhere to
#1 whenever it is possible.
 
Odgovor na temu

PeraPisar

Član broj: 35583
Poruke: 15
212.62.55.*



Profil

icon Re: "Nevidljivost" funkcije osnovne klase13.05.2005. u 13:21 - pre 200 meseci
OK, to bi onda bilo to....

Hvala svima na ulozenom trudu.
Pozdrav!
 
Odgovor na temu

[es] :: C/C++ programiranje :: "Nevidljivost" funkcije osnovne klase

[ Pregleda: 3198 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.