初级 C++:基类中的虚函数

beginner c++: virtual functions in a base class

提问人:Rich 提问时间:4/7/2009 最后编辑:Grace NoteRich 更新时间:7/15/2010 访问量:2165

问:

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

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

C++ visual-studio-2008 虚拟 未解析外部

评论


答:

15赞 JaredPar 4/7/2009 #1

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

virtual void destroyDelayBuffer(void) = 0;

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

1赞 Pablo Santa Cruz 4/7/2009 #2

使用纯虚函数:

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
3赞 MattJ 4/7/2009 #3

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

虚拟 void initializeDelayBuffer(void) = 0;

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

评论

0赞 Brian Neal 4/7/2009
同意,但请从参数列表中删除 void;那是 C 而不是 C++。
2赞 Uri 4/7/2009 #4

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

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

2赞 Jon Benedicto 4/7/2009 #5

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

virtual void destroyDelayBuffer(void) = 0;
1赞 Shree 4/7/2009 #6

除了上面的答案之外,您还不能实例化包含纯虚函数的类的对象,因此将来如果您打算拥有基类的对象,请记住将该函数设置为非纯虚函数。

评论

0赞 Rich 4/11/2009
是的,它是一个只能派生的基类。永远不会有它的对象,因为它太骨架了,无法做任何有用的事情。