 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Sch374le Daniel Guest
|
Posted: Fri Sep 24, 2004 7:26 pm Post subject: richtiges überladen von mem. funktionen? |
|
|
Hallo NG,
ist folgedes zulässiger Code
class X
{
public:
protected:
virtual int foo() = 0;
};
class Y : public X
{
public:
virtual int foo() { /**/ };
protected:
};
(und selbiges ohne virtual keyword davor)
sollte Compiler das beanstanden?
MfG
Daniel
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sun Sep 26, 2004 3:51 pm Post subject: Re: richtiges überladen von mem. funktionen? |
|
|
Schüle Daniel wrote:
| Quote: | Hallo NG,
ist folgedes zulässiger Code
class X
{
public:
protected:
virtual int foo() = 0;
};
class Y : public X
{
public:
virtual int foo() { /**/ };
protected:
};
(und selbiges ohne virtual keyword davor)
sollte Compiler das beanstanden?
|
Warum sollte er es beanstanden?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Werner Salomon Guest
|
Posted: Mon Sep 27, 2004 10:43 am Post subject: Re: richtiges überladen von mem. funktionen? |
|
|
"Schüle Daniel" <for_usenet2000 (AT) yahoo (DOT) de> wrote
| Quote: | ist folgedes zulässiger Code
class X
{
public:
protected:
virtual int foo() = 0;
};
class Y : public X
{
public:
virtual int foo() { /**/ };
protected:
};
|
Hallo Daniel,
Hinter foo ist das ';' zuviel und das return fehlt. Also besser
virtual int foo() { /**/ return 0; }
| Quote: | (und selbiges ohne virtual keyword davor)
das 'virtual' in 'Y' wegzulassen ist ok, aber wegen der besseren |
Lesbarkeit würde ich es stehen lassen.
Schwierigkeiten könntest Du noch haben, wenn Du versuchst X als
polymorphe Basis-Klasse zu benutzten - das ist ja meist der Sinn
solcher Konstrukte. Dann kommst Du von außen an X::foo nicht ran, da
es protected ist.
Also z.B.:
int mach( X& x ) {
return x.foo(); // <- Fehler, da X::foo protected
}
int main() {
Y y;
int erg = y.foo(); // ok
return mach( y );
}
kompiliert nicht.
Gruß
Werner
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Daniel Sch374le Guest
|
Posted: Mon Sep 27, 2004 5:42 pm Post subject: Re: richtiges überladen von mem. funktionen? |
|
|
Hi
[...]
| Quote: | (und selbiges ohne virtual keyword davor)
das 'virtual' in 'Y' wegzulassen ist ok, aber wegen der besseren
Lesbarkeit würde ich es stehen lassen.
|
ich persönlich finde es schade, dass virtual "optional" in abgeleiteten
classen ist
| Quote: | Schwierigkeiten könntest Du noch haben, wenn Du versuchst X als
polymorphe Basis-Klasse zu benutzten - das ist ja meist der Sinn
solcher Konstrukte. Dann kommst Du von außen an X::foo nicht ran, da
es protected ist.
|
ja das ist verständlich, das Beispiel hat mit "virtualen" Funktion wenig
Sinn ergeben
mich hat vor allem interessiert, ob ein (Klassen)Bezeichner seinen
Sichtbarkeitsbereich
(von protected --> public) so einfach wechseln darf
MfG
Daniel
[...]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Mon Sep 27, 2004 9:01 pm Post subject: Re: richtiges 374berladen von me... |
|
|
"Daniel Schüle" <uval (AT) rz (DOT) uni-karlsruhe.de> wrote:
| Quote: | Hi
[...]
(und selbiges ohne virtual keyword davor)
das 'virtual' in 'Y' wegzulassen ist ok, aber wegen der besseren
Lesbarkeit würde ich es stehen lassen.
ich persönlich finde es schade, dass virtual "optional" in abgeleiteten
classen ist
Schwierigkeiten könntest Du noch haben, wenn Du versuchst X als
polymorphe Basis-Klasse zu benutzten - das ist ja meist der Sinn
solcher Konstrukte. Dann kommst Du von außen an X::foo nicht ran, da
es protected ist.
ja das ist verständlich, das Beispiel hat mit "virtualen" Funktion wenig
Sinn ergeben
mich hat vor allem interessiert, ob ein (Klassen)Bezeichner seinen
Sichtbarkeitsbereich
(von protected --> public) so einfach wechseln darf
|
Beachte, dass fuer den Zugriff die *statischen* und nicht die
dynamischen Zugriffsrechte gelten:
Beispiel:
struct X
{
public:
virtual void foo();
};
struct Y:X
{
private:
virtual void foo();
};
void bar()
{
X* px = new Y;
p->foo(); // OK, Y::foo() wird ueber einen X-Ausdruck aufgerufen
Y* py = new Y;
py->id(); // Fehler, Aurfruf ueber einen Y-Ausdruck
}
Fuer das Zugriffsrecht auf das jeweilige 'foo' ist das Zugriffsrecht
in der Klasse des Ausdrucksaufrufs - im ersten Fall als der Typ von
px* : X und im zweiten Falle der Typ von py*:Y - entscheidend und
nicht das Zugriffsrecht der Klasse, der das Objekt angehoert, das
tatsaechlich am Zeiger haengt.
--
Horst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|