Рассмотрим суперкласс:
class superclass
{
public void fun() {.....}
}
и его подкласс:
class subclass extends superclass
{
public void fun(){.......}
public static void main()
{
superclass sup1=new superclass();
sup1.fun()//statement 1
superclass sup2=new subclass();
sup2.fun() //statement 2
subclass sub1=new subclass();
sub1.fun()//statement 3
}
}
Я следую следующим образом, чтобы определить, является ли это полиморфизмом времени компиляции или полиморфизмом времени выполнения для операторов 1,2 и 3:
Компилятор сначала определяет тип класса ссылочной переменной, используемой в операторе вызова, затем компилятор проверяет, присутствует ли какой-либо производный класс этой базы в исходном коде или нет, и переопределен ли метод, используемый в операторе вызова. или нет в производном классе. Если производный класс найден и содержит переопределенную версию функции, то во время выполнения определяется тип объекта, на который ссылается ссылочная переменная, и выполняется функция типа этого класса (полиморфизм времени выполнения), в противном случае функция присутствует в классе. (которой принадлежит ссылочная переменная) (полиморфизм времени компиляции).
происходит следующим образом:
1) оператор 1 вызовет полиморфизм во время выполнения.
2) оператор 2 также вызовет полиморфизм во время выполнения.
3) утверждение 3 вызовет полиморфизм времени компиляции.
Вопрос 1: Я хочу знать, является ли этот подход правильным или неправильным?
Вопрос 2: И что будет с процедурой, когда вместо ссылочной переменной используется оператор вызова функции, который возвращает адрес объекта?
Я думаю, что возвращаемый тип функции, которая возвращает адрес, будет использоваться при определении типа полиморфизма.
Я прав?