Qual é a diferença entre instâncias de função virtual em C ++?
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?
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
A primeira função pode ou não ter uma implementação na classe que declará-la, e tem para ser implementado por subclasses