【问题标题】:beginner c++: virtual functions in a base class初学者 C++:基类中的虚函数
【发布时间】:2010-10-17 21:28:02
【问题描述】:

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

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 virtual unresolved-external


    【解决方案1】:

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

    【讨论】:

    • 是的,它是一个只能派生的基类。永远不会有它的对象,因为它太骨架了,无法做任何有用的事情。
    【解决方案2】:

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

    virtual void destroyDelayBuffer(void) = 0;
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        虚空initializeDelayBuffer(void) = 0;

        这将创建一个你想要的界面。

        【讨论】:

        • 同意,但请从参数列表中删除 void;那是 C 而不是 C++。
        【解决方案5】:

        使用纯虚函数:

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

        【讨论】:

          【解决方案6】:

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

          virtual void destroyDelayBuffer(void) = 0;
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            • 2022-11-03
            • 2022-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多