代码之家  ›  专栏  ›  技术社区  ›  Rich khmarbaise

初学者C++:基类中的虚拟函数

  •  3
  • Rich khmarbaise  · 技术社区  · 17 年前

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

    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);
    };
    

    我想把它作为一个基类使用,而不是单独使用它。所以我有两个独立的类,它们是从这个类的合唱中衍生出来的。我想这样做只是为了简单地提供一些基本的约束,关于什么是派生的合唱类 必须 在我的程序中必须被认为是可用的。

    当我构建我的项目(Visual Studio 2008)时,会在这个合唱类的所有虚拟函数上得到未解决的外部符号错误。我猜这是一个典型的错误,我没有对这些函数进行前向声明。但是,由于它们是虚拟的,在派生类中定义它们之前,我不希望它们被实际定义为执行任何操作,我该怎么做来解决这个问题?

    6 回复  |  直到 16 年前
        1
  •  15
  •   JaredPar    17 年前

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

    virtual void destroyDelayBuffer(void) = 0;
    

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

        2
  •  3
  •   MattJ    17 年前

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

    虚拟void initializeDelayBuffer(void)=0;

    这将创建一个排序的接口,这正是您想要的。

        3
  •  2
  •   Uri    17 年前

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

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

        4
  •  2
  •   Jon Benedicto    17 年前

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

    virtual void destroyDelayBuffer(void) = 0;
    
        5
  •  1
  •   Pablo Santa Cruz    17 年前

    使用纯虚拟函数:

      virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
           nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;
    
        6
  •  1
  •   Shree    17 年前

    为了增加以上的答案,您不能实例化包含纯虚拟函数的类的对象,因此将来如果您打算拥有基类的对象,请记住使该函数非纯虚拟。