Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.01.2011, 15:30

[c++] Vererbung: Überschriebene Methoden aus Basisklasse aufrufen

Ich versuche gerade etwas in C++ so hinzubekommen, wie ich es aus java gewohnt bin. (man sieht vielleicht am Code, dass ich nicht wirklich professionell programmiere)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Base {
    public void amethod(){
        System.out.println("amethod basis");
    }
    public void bmethod(){
        this.amethod();
    }
}


public class Derived extends Base{
    public void amethod(){
        System.out.println("amethod derived");
    }
}

public class Main {

    public static void main(String args[]){
        Derived derived = new Derived();
        derived.bmethod();
    }
}

Die Ausgabe liefert mir in dem Fall "amethod derived". Was genau das ist, was ich will. Also den Aufruf einer Überschriebenen Methode aus dem Code der Basisklasse heraus.
Allerdings liefert mir dieser code in c++:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <stdio.h>
using namespace std;

class cBase{
public:
    void amethod()
    {
        printf("amethod basis\n");
    }
    void bmethod()
    {
        this->amethod();
    }
};
class cDerived : public cBase{
public:
    void amethod()
    {
        printf("amethod abgeleitet\n");
    }
};
int main() {
    cDerived derived;
    derived.bmethod();
    return 0;
}

die Ausgabe "amethod basis". Das ist wie gesagt nicht das was ich haben will.
Wenn aber beispielsweise die MFC oder ähnliche Schnittstellen so arbeiten wie SWING in Java dann sollte es doch irgendwie zu bewerkstelligen sein.

Hat jemand Einfälle?

2

14.01.2011, 15:45

Hi,

das Schlüsselwort heißt "virtual".
Versuch sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <stdio.h>
using namespace std;

class cBase{
public:
    virtual void amethod()
    {
        printf("amethod basis\n");
    }
    void bmethod()
    {
        this->amethod();
    }
};
class cDerived : public cBase{
public:
    void amethod()
    {
        printf("amethod abgeleitet\n");
        cBase::amethod();
    }
};
int main() {
    cDerived derived;
    derived.bmethod();
    return 0;
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

14.01.2011, 15:45

Das Schlüsselwort heißt virtual. In Java ist jede nicht statische (und nicht final) Methode automatisch virtual, in C++ musst du eine virtuelle Methode explizit als solche deklarieren. Virtuelle Methoden haben im Vergleich zu "normalen" Methoden einen minimalen Overhead (der unter gewissen Umständen allerdings signifikant werden kann). Es würde der Philosophie von C++ (You only pay for what you use) widersprechen dem Programmierer diesen Overhead automatisch aufzuzwingen wenn man dieses Feature meistens gar nicht braucht. Vielen andere Sprachen (z.B. C#) machen das übrigens auch so.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (14.01.2011, 15:50)


4

14.01.2011, 15:53

Danke vielmals. :love:
Das hat prima Funktioniert. :thumbsup:

Werbeanzeige