новичок c ++: виртуальные функции в базовом классе - PullRequest
3 голосов
/ 06 апреля 2009

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

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. Я предполагаю, что это типичная ошибка, когда я не делал предварительных объявлений этих функций. Но, поскольку они являются виртуальными, и я не хочу, чтобы они на самом деле определялись так, чтобы они что-то делали, пока они не будут определены в производных классах, что мне делать, чтобы решить эту проблему?

Ответы [ 6 ]

15 голосов
/ 06 апреля 2009

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

virtual void destroyDelayBuffer(void) = 0;

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

3 голосов
/ 06 апреля 2009

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

virtual void initializeDelayBuffer (void) = 0;

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

2 голосов
/ 06 апреля 2009

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

virtual void destroyDelayBuffer(void) = 0;
2 голосов
/ 06 апреля 2009

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

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

1 голос
/ 07 апреля 2009

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

1 голос
/ 06 апреля 2009

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

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
...