Dwie podobne definicje w języku Java i C++, ale zupełnie inne zachowanie. WersjaPrzesłanianie funkcji w języku Java vs C++
Java:
class base{
public void func1(){
func2();
}
public void func2(){
System.out.println(" I am in base:func2() \n");
}
}
class derived extends base{
public void func1(){
super.func1();
}
public void func2(){
System.out.println(" I am in derived:func2() \n");
}
};
public class Test
{
public static void main(String[] args){
derived d = new derived();
d.func1();
}
}
wyjściowa:
I am in derived:func2()
C++ wersja:
#include <stdio.h>
class base
{
public:
void func1(){
func2();
}
void func2(){
printf(" I am in base:func2() \n");
}
};
class derived : public base
{
public:
void func1(){
base::func1();
}
void func2(){
printf(" I am in derived:func2() \n");
}
};
int main()
{
derived *d = new derived();
d->func1();
return 0;
}
wyjściowa:
I am in base:func2()
Nie wiem, dlaczego mają inne zachowanie.
Nawet ja wiem, że Java ma zachowanie auto polimorfizmu.
Wyjście Java trudno zrozumieć osobiście.
Moim zdaniem według static scope
funkcja klasy bazowej func1()
powinien być w stanie wywołać funkcji klasy bazowej func2()
, jak to w ogóle nic nie wie o klasie pochodnej tylko. W przeciwnym razie zachowanie wywołujące należy do dynamic scope
. Może w C++, func2()
w klasie bazowej jest powiązany static
, ale w Javie jest to bind dynamic
?
Pole członkowskie ma zakres statystyczny.
Część wnioskowania części jest myląca. Myślałem, że this
jest konwertowane na base
typu w base::func1()
. W C++, base::func2()
nie jest polimorfizmem, dlatego wywoływany jest base::func1()
. Podczas gdy w języku Java, base::func2()
jest polimorfizmem, tak nazwano devried::func2()
.
W jaki sposób wiąże się wiązanie klasy func2()
? Lub Które fun2()
powinno być wywoływane i jak jest określane.
Co się stało za base::func1()
? Czy jest tu jakakolwiek obsada dla this
(od derive
do base
)? Jeśli nie, w jaki sposób this
jest w stanie osiągnąć funkcję w klasie base
?
void func1(){
func2();
}
Useful discussion na coderanch.
Przykro mi, ale to ostatnia część mojego komentarza. Naprawdę chcę wiedzieć, w jaki sposób implementacja typu jest zaimplementowana podczas wywoływania 'func2()' z 'base :: func1()'. – Kamel
Masz na myśli * W jaki sposób można wywnioskować powiązanie klasy "func2()"? * – aioobe
Dokładnie. Którego fun2() 'powinno się wywoływać i jak jest ono określane. – Kamel