Anzeige:
Ergebnis 1 bis 15 von 28

Thema: C++ und "virtual"

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194

    Post C++ und "virtual"

    Hallo!

    Angenommen ich habe eine Klasse welche Funktionen enthält die "virtual" sind, dann müssen diese ja in den abgeleiteten "überschrieben" also definiert werden. Will ich jedoch nun von der Klasse, die die virtuellen Funktionen enthält, ein Objekt (mit new) erstellen, so bekomm ich vom g++ immer die Meldung
    Code:
    error: cannot allocate an object of type ` Mitarbeiter' 
    error: because the following virtual functions are abstract:
    Oder auch wenn ich kein Objekt erstellen will und nur zb ein Array von der Klasse um später die Objekte von den abgeleiteten Klasse dort hin zu "referenzieren" funkt nicht! Ist das Wort "virtual" so ca. mit "abstract" von Java gleich zu setzen?!? Hab auch gehört wenn man eine Funktion "virtual" setzt, dann ist das jede Funktion von dieser Klasse! Stimmt das auch?!?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  2. #2
    Registrierter Benutzer
    Registriert seit
    11.07.2004
    Beiträge
    8
    Zitat Zitat von Silver
    Angenommen ich habe eine Klasse welche Funktionen enthält die "virtual" sind, dann müssen diese ja in den abgeleiteten "überschrieben" also definiert werden.
    Nein. Nur wenn sie abstrakt sind.
    Zitat Zitat von Silver
    error: cannot allocate an object of type ` Mitarbeiter'
    error: because the following virtual functions are abstract:
    Weil du sie abstrakt gemacht hast (mit =0).
    Zitat Zitat von Silver
    Ist das Wort "virtual" so ca. mit "abstract" von Java gleich zu setzen?!?
    Nein, in Java ist einfach jede Funktion virtual.
    Zitat Zitat von Silver
    Hab auch gehört wenn man eine Funktion "virtual" setzt, dann ist das jede Funktion von dieser Klasse! Stimmt das auch?!?
    Nein.

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    cool danke !

    aber was bedeutet nun virtual ohne dem =0 ?!?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  4. #4
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Eine virtuelle Funktion kann eine Funktionsbody haben, dann musst du die Funktion in der subclass nicht überschreiben.
    Wenn du die Funktion abstrakt, das heißt =0 machst, _muss_ jede subclass die Funktion implementieren, sonst ist das immer noch eine abstrakte Klasse von der man kein Objekt instanziieren kann.

    Michael.

    P.S: Vielleicht solltest du in deiner Signatur ein bisschen zwischen Regierung und gesamten Volk differenzieren, so klingt es ein wenig platt.

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Zitat Zitat von tuxipuxi
    Eine virtuelle Funktion kann eine Funktionsbody haben, dann musst du die Funktion in der subclass nicht überschreiben.
    aha danke, aber was bedeutet nun wenn man eine Funktion virtuell macht und nicht abstrakt?!? Kenne nur abstrakte Klassen von Java aus...

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  6. #6
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Folgendes Programm illustriert die Auswirkungen von virtual:
    Code:
    #include <iostream>
    
    class Foo {
    public:
        void called() { std::cout << "  Foo::called()" << std::endl; }
        virtual void vcalled() { std::cout << "  Foo::vcalled()" << std::endl; }
        void methode1() {
            std::cout << "Foo::methode1():" << std::endl;
            this->called(); this->vcalled();
        }
    };
    class Bar : Foo {
    public:
        void called() { std::cout << "  Bar::called()" << std::endl; }
        virtual void vcalled() { std::cout << "  Bar::vcalled()" << std::endl; }
        void methode2() {
            std::cout << "Bar::methode2():" << std::endl;
            this->called(); this->vcalled();
        }
        void methode3() {
            std::cout << "Bar::methode3():" << std::endl;
            Foo::called(); Foo::vcalled();
        }
        void methode4() {
            std::cout << "Bar::methode4():" << std::endl;
            this->methode1();
        }
    };
    
    int main() {
        Foo f;
        Bar b;
        f.methode1();
        b.methode2();
        b.methode3();
        b.methode4();
        return EXIT_SUCCESS;
    }
    Ausgabe:
    Code:
    Foo::methode1():
      Foo::called()
      Foo::vcalled()
    Bar::methode2():
      Bar::called()
      Bar::vcalled()
    Bar::methode3():
      Foo::called()
      Foo::vcalled()
    Bar::methode4():
    Foo::methode1():
      Foo::called()
      Bar::vcalled()
    Virtuelle Methoden werden nicht direkt aufgerufen, sonderen über die Virtuelle Methodentabelle des Objekts. In dieser wird so immer die Adresse der Methode abgelegt, welche in der instanzierten Klasse definiert ist.

    Im Beispiel oben kommt das im Letzten Methodenaufruf b.methode4() zum Ausdruck: Eine nicht virtuelle Methode called() wird immer diejenige der gleichen Klasse aufgerufen, während die viruelle Methode vcalled() der instanzierten Klasse Bar aufgerufen wird, obwohl Foo noch nichts von dieser Methode wissen muss.

    Eine virtuelle Klasse ist daher ein unverzichtbares Werkzeug für polymorphe Klassen.

    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •