Pergunta

Qual é a diferença entre as duas declarações seguintes?

virtual void calculateBase() = 0;  
virtual void calculateBase();

Eu li o primeiro (= 0) é uma "função abstrato puro", mas o que isso faz o segundo?

Foi útil?

Solução

O primeiro é chamado de função virtual pura. funções virtuais normalmente puros não terá qualquer aplicação e você não pode criar uma instância de uma classe que contém uma função virtual pura.

O segundo é uma função virtual (ou seja, uma função virtual 'normal'). A classe fornece a implementação para esta função, mas a sua classe derivada pode substituir essa implementação, fornecendo sua própria implementação para este método.

Outras dicas

O primeiro é um "puro virtual" - ele vai fazer a classe abstrata, a tentativa de criar uma instância que irá resultar em erros do compilador. Destina-se a ser utilizado como uma classe de base onde a classe derivada implementa o comportamento necessário através da implementação da função virtual puro. Você não tem que implementar a função na classe base, mas você pode.
Este é um padrão usado frequentemente para dois padrões de design:

  • "método de modelo" padrão de design , onde os implementos classe base uma estrutura em torno de um chamada de função, mas os detalhes da chamada de função deve ser preenchida pela classe derivada, e
  • A "interface" padrão de design, porque C ++ não tem a palavra-chave interface. classes base abstratas, de preferência com funções virtuais única puros e sem dados de membros, são o caminho C ++ de definir interfaces.

A segunda declaração é apenas uma declaração de função de membro virtual comum. Você receberá erros do compilador se você deixar de implementar a função de membro da classe base. Ele ainda é virtual o que implica que ele pode ser útil para substituir o comportamento em uma classe derivada.

O primeiro não tem de ser implementado na classe base, mas o aplica a ser implementado em classes herdadas.

Você tem que implementar o segundo na classe base e pode ser implementado em classes herdadas.

Basicamente, ao herdar, você obrigado para substituir o primeiro, e são permitido para substituir o segundo.

Vindo de Java, não é?

Eu acho que você está misturando termos ...

virtual void x() = 0;

é um pura função virtual , ou função abstrato. É uma função virtual sem implementação. Você fala sobre uma classe abstrata pura, que é o c ++ equivalente a uma interface, sobre uma classe ter funções só abstratos.

virtual void x();

é uma função virtual, o que significa que pode ser redefinido em classes derivadas, mas não é abstrata, então você deve fornecer uma implementação para ele.

calculateBase virtual void () = 0;

A primeira função é função virtual Pure onde a implementação não pode ser feito na classe e agir como classe abstrata pura ou classe Interface. A execução concreta deve ser feito ou anulado na subclasse. É agir como classe de interface para suas classes derivadas.

calculateBase virtual void ();

Esta função é função virtual onde a implementação (padrão) podem ser feitas na classe base. Mas, a classe derivada deve ser anulado o seu próprio imeplementation.

Em Java

virtual void calculateBase() = 0;  

seria

abstract void calculateBase();

e

virtual void calculateBase();

seria

void calculateBase();

Para ser perfeitamente claro,

void calculateBase();

em C ++, é "o mesmo", como

final void calculateBase();

em Java. Ou seja, final é "default" em C ++. Há uma exceção a esta regra no entanto. Quando subclasse uma classe com um método virtual e reimplementar-lo sem usar a palavra-chave virtual, o método na subclasse irá não ser final.

A segunda função deve ter uma implementação na classe que declarando-(falta de '= 0'), e pode ser substituído por subclasses.

A primeira função pode ou não ter uma implementação na classe que declará-la, e tem para ser implementado por subclasses

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top