2009-04-06 3 views
3

Я пишу код, в котором я определил следующий базовый класс.beginner C++: виртуальные функции в базовом классе

Я хочу использовать это как базовый класс и на самом деле ничего не делать с ним самостоятельно. Поэтому у меня есть два отдельных класса, которые получены из этого класса Chorus. Я хотел сделать это, чтобы просто предоставить некоторые основные ограничения в отношении того, что любой производный класс Chorus MUST должен считаться полезным в моей программе.

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

ответ

15

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

virtual void destroyDelayBuffer(void) = 0; 

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

+1

Так близко! :) Хороший ответ. –

1

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

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

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

virtual void initializeDelayBuffer (void) = 0;

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

+0

Согласитесь, но удалите пустоту из списка аргументов; это C не C++. –

2

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

virtual void destroyDelayBuffer(void) = 0; 
1

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

+0

Да, это базовый класс, из которого можно получить только. У него никогда не будет объектов, потому что он слишком скелетен, чтобы делать что-нибудь полезное. – Rich