A relação de herança entre virtual e override

Insira a descrição da imagem aqui
Claro, o BB acima é herdado de AA

em princípio:

1, quando a função de chamada, o sistema irá diretamente para verificar a declaração da classe , uma função chamada para ver se a função virtual;

2. Se não for, ele executa a função diretamente. Se uma função virtual é transferida para a instância do objeto de inspeção da classe .

3. Na classe de instância, se houver uma função de substituição, execute a função. Caso contrário, volte por sua vez , siga as mesmas etapas para verificar a classe pai e encontre a primeira classe pai que substitui esta função e, em seguida, execute o Funções na classe pai.

No processo rastreado , a subclasse com o mesmo nome da parte da classe pai deve Vartual o relacionamento Override foi reconhecido para o mesmo método, quando uma subclasse pode ser rastreada de volta para consultas relacionadas, caso contrário, levará ao método de interrupção que rastreou diretamente a classe de instrução de chamada .

exemplo:

Insira a descrição da imagem aqui
resultado:
Insira a descrição da imagem aqui

explicar:

DD dd = new DD (); O que é impresso é: DD não tem nada a dizer, sem subclasses, sem polimorfismo

CC cc = dd;
1. Esta classe irá verificar se o displayName em CC (embora não haja virtual nesta classe, mas no pai de seu pai) é um método virtual, então procure sua substituição na classe DD ( Substituir)
2. O resultado não foi encontrado
3. Então, voltamos ao CC para pesquisar, encontramos e usamos o método displayName no CC

BB bb = dd;
1. Descobriu que displayName é um método virtual em BB, então procure em DD,
2. Sem reescrita
3. Volte para CC, encontre a reescrita de CC, então use displayName em CC

(Pontos principais) AA aa = dd;
1. Verifica-se que displayName é um método virtual em AA
2. Portanto, é pesquisado em DD e não reescrito
3. Portanto, é pesquisado em CC e reescrito, mas é reescrito em BB Método
4. O displayName em BB e AA não é o mesmo método? Resposta: Não.
5. Não há relacionamento Virtual e Override entre
as classes 6. Então, finalmente, o displayName na classe AA é chamado, porque é interrompido no BB e não há como substituí-lo.

Acho que você gosta

Origin blog.csdn.net/ww1351646544/article/details/95652497
Recomendado
Clasificación