提问人:Rich 提问时间:4/7/2009 最后编辑:Grace NoteRich 更新时间:7/15/2010 访问量:2165
初级 C++:基类中的虚函数
beginner c++: virtual functions in a base class
问:
我正在编写一些代码,其中定义了以下基类。
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 类中所有虚拟函数的未解决的外部符号错误。我猜这是我没有对这些函数进行正向声明的典型错误。但是,由于它们是虚拟的,并且我不希望它们在派生类中定义之前实际被定义为执行任何操作,因此我该怎么做才能解决此问题?
答:
如果你的意图是让它们只是子类实现的占位符,那么通过以 = 0 结尾来使它们成为纯虚函数。例如
virtual void destroyDelayBuffer(void) = 0;
可以说,这使得该方法变得“抽象”。C++ 编译器不会查找方法的实际定义,而是强制所有派生类在创建实例之前实现这些方法。
使用纯虚函数:
virtual int callback( void *outputBuffer, void *notUsed, unsigned int
nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
您需要将这些函数声明为纯虚拟函数。
虚拟 void initializeDelayBuffer(void) = 0;
这将创建一个各种界面,这是你想要的。
评论
这称为纯虚函数。 在 C++ 中,在函数名称后写一个“=0”, 但您可能想阅读有关这些的常见问题解答。
http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4
您需要将函数定义为纯虚函数。为此,请在每个声明后添加一个“= 0”。例如:
virtual void destroyDelayBuffer(void) = 0;
除了上面的答案之外,您还不能实例化包含纯虚函数的类的对象,因此将来如果您打算拥有基类的对象,请记住将该函数设置为非纯虚函数。
评论
上一个:共享库中的静态类成员
评论