Virtuelle Funktionen in C ++ und Java

Ich habe über virtuelle Funktionen gelesen und festgestellt,

VF werden beim Polymorphismus einer geerbten Klasse verwendet.

Wenn also eine Klasse und eine abgeleitete Klasse denselben Funktionsnamen haben, bindet VF die entsprechende Funktion an den Funktionsaufruf.

Wenn die fragliche Funktion in der Basisklasse als virtuell bezeichnet wird, wird die Funktion der abgeleiteten Klasse aufgerufen. Wenn es nicht virtuell ist, wird die Funktion der Basisklasse aufgerufen.

Standardmäßig in Java: Alle Funktionen sind Virtual C ++: Nicht virtuell und können in Java mithilfe des letzten Modifikators für den privaten Zugriff virtuell gemacht werden, während in C ++ mithilfe des Schlüsselworts Virtual eine Funktion virtuell gemacht wird.

Basierend auf der obigen Theorie habe ich den Code geschrieben:

#include <iostream>

class base{
    public : 
        virtual void function1(){
            std::cout<<"BaseVirtual"<<std::endl;
        }

        void function2(){
            std::cout<<"Base NonVirtual"<<std::endl;
        }
};


class derieved: public base
{
    public : 
        void function1(){
            std::cout<<"Derieved Virtual"<<std::endl;
        }

        void function2(){
            std::cout<<"Derieved NonVirtual"<<std::endl;
        }
};



int main()
{
    base b1;
    derieved d1;

    b1.function1();
    b1.function2();

    d1.function1();
    d1.function2();    

}

Wenn nun basierend auf der Tatsache, dass es sich um eine virtuelle Funktion handelt, nur eine abgeleitete Klassenfunktion aufgerufen wird, sollte meine Ausgabe für das obige Programm sein:

BaseVirtual
Base NonVirtual
Derieved Virtual
Base NonVirtual

es stellte sich jedoch heraus:

BaseVirtual
Base NonVirtual
Derieved Virtual
Derieved NonVirtual

was natürlich richtig sein muss. Meine Frage ist also, dass die Ausgabe die Aussage total verletztWenn die betreffende Funktion in der Basisklasse als virtuell bezeichnet wird, wird die Funktion der abgeleiteten Klasse aufgerufen. Wenn es nicht virtuell ist, wird die Funktion der Basisklasse aufgerufen. für den Anruf:

  d1.function2();    

Antworten auf die Frage(3)

Ihre Antwort auf die Frage