Considerações virtuais em c ++

Video: Curso de C++ - Aula 34 - Funções virtuais

Você precisa ter em mente algumas coisas quando se utiliza funções virtuais em C ++. Em primeiro lugar, as funções de membro estático não pode ser declarado virtual. Porque funções membro estático não são chamados com um objecto, não existe nenhum objecto tempo de execução em que basear uma decisão de ligação.

Video: Virtual Functions in C & c++HINDI URDU

Em segundo lugar, especificando o nome da classe na chamada força uma chamada para ligar mais cedo, ou não a função é virtual. Por exemplo, a seguinte chamada é Base de Dados de :: fn () porque é isso que o programador indicado, mesmo se fn () é declarado virtual:

void test (Base de Dados& b) {b.Base :: fn () - // esta chamada não está vinculada final}

Finalmente, os construtores não pode ser virtual, porque não há (concluído) objeto para usar para determinar o tipo. Na época, o construtor é chamado, a memória que o objeto ocupa é apenas uma massa amorfa. É somente depois que o construtor tenha terminado que o objeto é um membro da classe em boa posição.

Video: c++ w pigułce (extern, virtual, polimorfia, class, static, const, protected, private, public) #3

Em comparação, o destruidor quase sempre deve ser declarado virtual. Se não, você corre o risco de destructing indevidamente o objeto, como no seguinte circunstância:

Classe base {public: ~ Base () -} - CLASSE Subclasse: Base de dados pública {public: ~ SubClass () -} - vazio finishWithObject (Base * pHeapObject) {// ... trabalhar com objeto ... // agora retorno -lo para o heapdelete pHeapObject- // isto chama base de ~ () não importa} // o tipo de tempo de execução de // pHeapObject

Se o ponteiro passado para finishWithObject () realmente aponta para um subclasse, a SubClass destrutor não é chamado corretamente - porque o destruidor não foi declarado virtual, é sempre obrigado cedo. Declarando o processo de destruição virtual resolve o problema.



Então, quando você não quer declarar o destruidor virtual? Há apenas um caso. funções virtuais introduzir um “pouco” em cima.

Mais especificamente: Quando o programador define a primeira função virtual em uma classe, C ++ adiciona um ponteiro adicional, escondido - e não um ponteiro per função virtual, apenas um ponteiro, se a classe tem quaisquer funções virtuais. Uma classe que não tem funções virtuais (e não herda todas as funções virtuais a partir de classes base) não tem esse ponteiro.

Video: C++ Virtual Destructors

Agora, um ponteiro não parecer muito, e não é a menos que as duas condições a seguir forem verdadeiras:

  • A classe não tem muitos membros de dados (para que um ponteiro representa muito em comparação com o que já está lá).

  • Você pretende criar um monte de objetos desta classe (caso contrário, a sobrecarga não faz qualquer diferença).

Se estas duas condições sejam atendidas e sua turma ainda não tem funções membro virtuais, você pode não querer declarar o destruidor virtual.

Exceto por este caso, sempre declarar destruidores de ser virtual, mesmo se a classe não está (ainda) uma subclasse - você nunca sabe quando alguém vai vir e usar sua classe como a classe base para o seu próprio. Se você não declarar o destruidor virtual, em seguida, declarar a classe final (se o seu compilador suporta esta funcionalidade) e documentá-lo!


Publicações relacionadas