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