3

我正在编写一些代码,其中定义了以下基类。

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 类的所有虚函数上得到了未解决的外部符号错误。我猜这是我没有对这些函数进行前向声明的典型错误。但是,由于它们是虚拟的,并且在派生类中定义它们之前,我不希望它们实际上被定义为做任何事情,我该怎么做才能解决这个问题?

4

6 回答 6

15

如果您的意图是让它们成为子类实现的简单占位符,那么通过以 = 0 结尾使它们成为纯虚函数。例如

virtual void destroyDelayBuffer(void) = 0;

这使得该方法可以说是“抽象的”。C++ 编译器不会寻找方法的实际定义,而是会强制所有派生类在创建实例之前实现这些方法。

于 2009-04-06T19:37:19.877 回答
3

您需要将这些函数声明为纯虚拟函数。

虚拟无效初始化延迟缓冲区(无效)= 0;

这将创建一个各种各样的界面,这就是你想要的。

于 2009-04-06T19:38:22.137 回答
2

这称为纯虚函数。在 C++ 中,您在函数名称后写一个“=0”,但您可能想阅读有关这些的常见问题解答。

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

于 2009-04-06T19:39:34.770 回答
2

您需要将函数定义为纯虚函数。为此,请在每个声明后添加一个“= 0”。例如:

virtual void destroyDelayBuffer(void) = 0;
于 2009-04-06T19:39:49.730 回答
1

使用纯虚函数:

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
于 2009-04-06T19:37:53.853 回答
1

只是为了补充上述答案,您不能实例化包含纯虚函数的类的对象,因此将来如果您打算拥有基类的对象,请记住使函数为非纯虚函数。

于 2009-04-07T05:26:16.670 回答