Funkcje wirtualne w C ++ i Javie

Czytałem o funkcjach wirtualnych i znalazłem,

VF są używane w polimorfizmie dziedziczonej klasy.

Jeśli więc klasa i klasa pochodna mają tę samą nazwę funkcji, VF wiąże odpowiednią funkcję z wywołaniem funkcji.

tzn. jeśli dana funkcja jest oznaczona jako wirtualna w klasie bazowej, wówczas wywołana zostanie funkcja klasy pochodnej. Jeśli nie jest wirtualny, wywołana zostanie funkcja klasy bazowej.

Domyślnie w Javie: wszystkie funkcje są wirtualne C ++: nie wirtualne i mogą być wirtualne w Javie przy użyciu końcowego, prywatnego modyfikatora dostępu w C ++ przy użyciu słowa kluczowego Virtual, aby uczynić funkcję wirtualną.

Na podstawie powyższej teorii napisałem kod:

#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();    

}

Teraz, opierając się na tym fakcie, jeśli jest to funkcja wirtualna, wtedy wywoływana jest tylko funkcja klasy pochodnej, moim wyjściem dla powyższego programu powinno być:

BaseVirtual
Base NonVirtual
Derieved Virtual
Base NonVirtual

jednak okazało się, że:

BaseVirtual
Base NonVirtual
Derieved Virtual
Derieved NonVirtual

co oczywiście musi być właściwe. Moje pytanie brzmi, że wyjście całkowicie narusza stwierdzenieJeśli dana funkcja jest oznaczona jako wirtualna w klasie bazowej, wówczas wywołana zostanie funkcja klasy pochodnej. Jeśli nie jest wirtualny, wywołana zostanie funkcja klasy bazowej. dla połączenia:

  d1.function2();    

questionAnswers(3)

yourAnswerToTheQuestion