c ++ para principiantes: las funciones virtuales de una clase base
-
05-09-2019 - |
Pregunta
Estoy escribiendo algo de código en el que definen las siguientes clases 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);
};
Quiero usar esto como una clase base y en realidad no hacer nada con ella por su propia cuenta. Así que tengo dos clases separadas que se derivan de esta clase Coro. Yo quería hacer esto simplemente proporcionar algunas limitaciones básicas en cuanto a lo que cualquier clase derivada Coro debe tienen que ser considerados utilizables en mi programa.
Cuando construyo mi proyecto (Visual Studio 2008), me sale sin resolver errores de símbolos externos en todas las funciones virtuales de esta clase de coro. Yo supongo que es el error típico en el que no hice hacia adelante declaraciones de estas funciones. Pero, ya que son virtuales y no quieren que se pueden definir realmente a hacer nada hasta que se definen dentro de las clases derivadas, ¿qué debo hacer para resolver este problema?
Solución
Si su intención es para que puedan ser simplemente colocan los titulares de las clases hijas de implementar, a continuación, hacen de ellos las funciones virtuales puras, poniendo fin a = 0. Por ejemplo
virtual void destroyDelayBuffer(void) = 0;
Esto hace que el método "abstracto" por así decirlo. El compilador de C ++ no buscará una definición real de la metodología, sino que obligará a todas las clases derivadas para poner en práctica estos métodos antes de una instancia puede ser creado.
Otros consejos
Es necesario declarar aquellos función virtual pura.
virtual void initializeDelayBuffer (void) = 0;
Esto creara una interfaz de tipo, que es lo que desea.
Esto se llama a una función virtual pura. En C ++ se escribe un "= 0" después de que el nombre de la función, pero es probable que desee leer las preguntas frecuentes sobre las mismas.
http://www.parashift.com/c++ -FAQ-lite / abcs.html # faq-22.4
Es necesario definir las funciones como funciones virtuales puras. Para ello, agregue un "= 0" después de cada declaración. Por ejemplo:
virtual void destroyDelayBuffer(void) = 0;
Utilice una función virtual pura:
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
Sólo para añadir a las respuestas anteriores, no se puede crear una instancia de un objeto de una clase que contiene funciones virtuales puras, por lo que en el futuro si la intención de tener objetos de su clase base, no olvide que la función no virtual pura.