C++ для начинающих: виртуальные функции в базовом классе

Я пишу код, в котором я определил следующий базовый класс.

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);
};

Я хочу использовать это как базовый класс и ничего не делать с ним самостоятельно. Итак, у меня есть два отдельных класса, которые являются производными от этого класса Chorus. Я хотел сделать это, чтобы просто предоставить некоторые основные ограничения относительно того, что любой производный класс Chorus ДОЛЖЕН считать пригодным для использования в моей программе.

Когда я создаю свой проект (Visual Studio 2008), я получаю неразрешенные ошибки внешних символов для всех виртуальных функций из этого класса Chorus. Я предполагаю, что это типичная ошибка, когда я не сделал предварительное объявление этих функций. Но, поскольку они виртуальные, и я не хочу, чтобы они действительно выполняли какие-либо действия, пока они не будут определены в производных классах, что мне делать, чтобы решить эту проблему?


person Rich    schedule 06.04.2009    source источник


Ответы (6)


Если вы хотите, чтобы они были просто заполнителями для реализации дочерних классов, сделайте их чистыми виртуальными функциями, оканчивающимися на = 0. Например

virtual void destroyDelayBuffer(void) = 0;

Это делает метод, так сказать, «абстрактным». Компилятор C++ не будет искать фактическое определение метода, а вместо этого заставит все производные классы реализовать эти методы до создания экземпляра.

person JaredPar    schedule 06.04.2009

Вам нужно объявить эти функции как чисто виртуальные.

виртуальная пустота initializeDelayBuffer(void) = 0;

Это создаст своего рода интерфейс, который вам нужен.

person MattJ    schedule 06.04.2009
comment
Согласен, но удалите пустоту из списка аргументов; это С, а не С++. - person Brian Neal; 06.04.2009

Это называется чистой виртуальной функцией. В C++ вы пишете "=0" после имени функции, но вы, вероятно, захотите прочитать FAQ по ним.

http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4

person Uri    schedule 06.04.2009

Вам нужно определить функции как чистые виртуальные функции. Для этого добавьте «= 0» после каждого объявления. Например:

virtual void destroyDelayBuffer(void) = 0;
person Jon Benedicto    schedule 06.04.2009

Используйте чистую виртуальную функцию:

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
person Pablo Santa Cruz    schedule 06.04.2009

Просто чтобы добавить к приведенным выше ответам, вы не можете создать экземпляр объекта класса, содержащего чисто виртуальные функции, поэтому в будущем, если вы собираетесь иметь объекты своего базового класса, не забудьте сделать функцию не чистой виртуальной.

person Shree    schedule 07.04.2009
comment
Да, это базовый класс, от которого можно получить только производные. Из него никогда не будет объектов, потому что он слишком костляв, чтобы делать что-то полезное. - person Rich; 10.04.2009