iniciante c ++: funções virtuais em uma classe base
-
05-09-2019 - |
Pergunta
Estou a escrever algum código onde eu definida a seguinte classe de base.
class Chorus{
public:
//Destructor
virtual ~Chorus();
//callback function
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData );
virtual void initializeDelayBuffer(void);
virtual void destroyDelayBuffer(void);
};
Eu quero usar isso como uma classe base e não realmente fazer alguma coisa com ele por conta própria. Então, eu tenho duas classes distintas que são derivados a partir desta classe Chorus. Eu queria fazer isso simplesmente fornecer algumas restrições básicas, como o que qualquer classe Chorus derivado deve tem que ser considerada utilizável no meu programa.
Quando eu construir meu projeto (Visual Studio 2008), eu recebo erros de símbolos externos não resolvidos sobre todas as funções virtuais a partir desta classe Chorus. Eu estou supondo que é o erro típico onde eu não fazer frente declarações destas funções. Mas, uma vez que eles são virtuais e eu não quero que eles realmente ser definido para fazer qualquer coisa até que sejam definidos dentro das classes decorrentes, o que eu faço para resolver este problema?
Solução
Se a sua intenção é para que eles sejam simplesmente coloque suportes para classes filhas para implementar, em seguida, torná-los funções virtuais puras por terminando com = 0. Por exemplo
virtual void destroyDelayBuffer(void) = 0;
Isso faz com que o método "abstrato" por assim dizer. O compilador C ++ não vai olhar para uma definição real do método mas em vez irá forçar todas as classes derivadas para implementar esses métodos antes de uma instância pode ser criada.
Outras dicas
Você precisa declarar as funções como pura virtual.
virtual void initializeDelayBuffer (void) = 0;
Isso vai criar uma interface do tipo, que é o que você quer.
Isso é chamado de uma função virtual pura. Em C ++ você escreve um "= 0" após o nome da função, mas você provavelmente vai querer ler o FAQ sobre estes.
http://www.parashift.com/c++ -faq-lite / abcs.html # faq-22,4
Você precisa definir as funções como funções virtuais puros. Para fazer isso, adicione um "= 0" após cada declaração. Por exemplo:
virtual void destroyDelayBuffer(void) = 0;
Use uma função virtual pura:
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
Só para acrescentar às respostas acima, você não pode instanciar um objeto de uma classe que contém funções virtuais puras, assim, no futuro, se você pretende ter objetos de sua classe base, lembre-se de fazer o virtual função não-puro.