Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Schlüsselwort virtual

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.03.2005, 19:02 Uhr
mauralix



Hallo Leute!

Wieder habe ich ein programmiertechnisches Problem, aber ich bin mir sicher das die Lösung durch das Setzen des virtual Schlüsselwortes machbar ist.

Und zwar ich habe 2Klassen :
A und B (B wird von A abgeleitet)

beide haben die Funktionen foo und baz wobei sie je seperat ausprogrammiert werden.


C++:
#include <iostream.h>


class A{

public:
    void foo(){
         cout<<"foo-A"<<endl;
}

    void baz(){

        cout<<"baz-A"<<endl;
        foo();

    }

};


class B:public A{

public:

void foo(){
         cout<<"foo-B"<<endl;
}

    void baz(){

        cout<<"baz-B"<<endl;
        foo();

    }


};

int main(){

B *b;


b->baz();


return 0;
}




Die Ausgabe lautet immer :
baz-B
foo-B

Ich möchte aber erreichen dass bei Aufruf von b->baz() nicht die foo() Funktion der B Klasse aufgerufen wird sondern die foo() Funktion der A Klasse.

Die Ausgabe sollte dann lauten:
baz-B
foo-A

Lösungen bitte posten!
--
nur olfaktorisch fassbar....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.03.2005, 23:53 Uhr
ao

(Operator)


Mit virtual ist da nix zu reißen.

Du musst das b als Objekt vom Typ A ansprechen, dann kommen auch die Methoden von A.


C++:
// Definition von A und B wie oben.
int main()
{
    B b;
    b.baz();    // "baz-B"
    
    ((A)b).baz ();  // "baz-A"
    
    getchar ();
    return 0;
}



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.03.2005, 23:56 Uhr
ao

(Operator)


Ach so, ich vergaß. Das hier:

Zitat von mauralix:

C++:
B *b;
b->baz();




ist ein Fehler; b ist ein wilder Pointer, der nicht auf ein gültiges Objekt zeigt. Wenn man darüber trotzdem Methoden erreicht, ist das Zufall. Das Programm kann genausogut abstürzen. Besser: b richtig instanzieren, siehe oben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.03.2005, 01:29 Uhr
typecast
aka loddab
(Operator)


->
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.03.2005, 20:55 Uhr
Spacelord
Hoffnungsloser Fall


Der Cast auf A ist doch unnötig!?
Ich kann doch die Methode der Superklasse mit A::foo() aufrufen.


C++:
class B:public A{

public:

void foo(){
         cout<<"foo-B"<<endl;
}

    void baz(){

        cout<<"baz-B"<<endl;
        A::foo();

    }


};



MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 23.03.2005 um 20:57 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.03.2005, 22:53 Uhr
ao

(Operator)



Zitat von Spacelord:
Der Cast auf A ist doch unnötig!?
Ich kann doch die Methode der Superklasse mit A::foo() aufrufen.


Aus dem Innern von B heraus, ja. Aber mauralix wollte es aus main, also von außen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.03.2005, 06:32 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von mauralix:


Ich möchte aber erreichen dass bei Aufruf von b->baz() nicht die foo() Funktion der B Klasse aufgerufen wird sondern die foo() Funktion der A Klasse.

Die Ausgabe sollte dann lauten:
baz-B
foo-A




MfG Spacelord

--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.03.2005, 08:14 Uhr
(un)wissender
Niveauwart


Hm, diese Forderung macht aber keinen Sinn...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.03.2005, 19:34 Uhr
mauralix



anscheinend ist es so unmöglich,aber kein Problem ich muss es halt eben auf die alte Art machen
--
nur olfaktorisch fassbar....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: