beginner c ++:基类中的虚函数

时间:2009-04-06 19:35:45

标签: c++ visual-studio-2008 virtual unresolved-external

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

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类 MUST 必须被认为在我的程序中可用。

当我构建我的项目(Visual Studio 2008)时,我在此Chorus类的所有虚函数上得到了未解析的外部符号错误。我猜这是典型的错误,我没有做出这些函数的前向声明。但是,由于它们是虚拟的,我不希望它们被实际定义为在导出类中定义之前做任何事情,我该怎么做才能解决这个问题?

6 个答案:

答案 0 :(得分:15)

如果你的目的是让它们只是实现子类的占位符,那么以= 0结尾使它们成为纯虚函数。例如

virtual void destroyDelayBuffer(void) = 0;

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

答案 1 :(得分:3)

您需要将这些功能声明为纯虚拟。

virtual void initializeDelayBuffer(void)= 0;

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

virtual void destroyDelayBuffer(void) = 0;

答案 4 :(得分:1)

使用纯虚函数:

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

答案 5 :(得分:1)

只是为了添加上述答案,您无法实例化包含纯虚函数的类的对象,因此将来如果您打算拥有基类的对象,请记住将该函数设置为非纯虚函数。