C++ 为什么VC2008认为这个类是抽象的?

C++ 为什么VC2008认为这个类是抽象的?,c++,abstract-class,directshow,C++,Abstract Class,Directshow,我正在编写一些代码来使用DirectShow处理来自一些摄像头的视频输入,所以我必须实现ISampleGrabberCB 实现接口的类可以编译,但当我尝试实例化它时,编译器会引发错误C2259:“SampleGrabberCB”:无法实例化抽象类 STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen) 以下是我正在实现的接口: interface ISamp

我正在编写一些代码来使用DirectShow处理来自一些摄像头的视频输入,所以我必须实现ISampleGrabberCB

实现接口的类可以编译,但当我尝试实例化它时,编译器会引发错误C2259:“SampleGrabberCB”:无法实例化抽象类

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen)
以下是我正在实现的接口:

interface ISampleGrabberCB : public IUnknown {
    virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0;
    virtual STDMETHODIMP BufferCB( double SampleTime, BYTE *pBuffer, long BufferLen ) = 0;
};
这是我的SampleGrabberCB标题:

#pragma once

#include "stdafx.h"

class SampleGrabberCB : public ISampleGrabberCB {
private:

    int                 _refCount;
    DShowCaptureDevice* _parent;

public:
//  SampleGrabberCB();
    SampleGrabberCB(DShowCaptureDevice* parent);
    ~SampleGrabberCB();

    virtual STDMETHODIMP BufferCB(double sampleTime, BYTE* pBuffer, long bufferLen);
    virtual STDMETHODIMP SampleCB(double sampleTime, IMediaSample * pSample, long bufferLen);

#pragma region IUnknown

    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) {

        if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ) {

            *ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
            return NOERROR;
        }

        return E_NOINTERFACE;

    }

    virtual ULONG STDMETHODCALLTYPE AddRef() {
        return ++_refCount;
    }

    virtual ULONG STDMETHODCALLTYPE Release() {
        int n = --_refCount;
        if (n &lt;= 0) {
            delete this;
        }
        return n;
    }

#pragma endregion
};
以下是我如何使用它:

SampleGrabberCB* callback = new SampleGrabberCB(device);

有什么想法吗?谢谢

接口中声明的SampleCB没有SampleGrabberCB类中存在的第三个参数bufferLen。

接口中声明的SampleCB没有SampleGrabberCB类中存在的第三个参数bufferLen。

SampleCB方法与基本抽象类中的方法不匹配

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen)

virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0; 

SampleCB方法与基抽象类中的方法不匹配

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen)

virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0; 

虚拟STDMETHODIMP SampleCBdouble sampleTime,imedisample*pSample,long bufferLen方法的签名与接口中纯虚拟方法的签名不匹配-您需要删除bufferLen参数。

虚拟STDMETHODIMP SampleCBdouble sampleTime,imedisample*pSample,long bufferLen方法与接口中的纯虚拟方法不匹配-您需要删除bufferLen参数。

看起来SampleCB方法中的方法签名不同。On case有2个参数和其他3个参数。

在SampleCB方法中,方法签名似乎不同。On case有2个参数和其他3个参数。

编译器通常会告诉您错误消息其余部分缺少什么。但是编译器没有。这是它给出的唯一错误消息,正如我所说,我的类编译得很好。编译器通常会告诉您错误消息的其余部分缺少什么。但是编译器没有。这是它给出的唯一错误消息,正如我所说,我的类编译得很好。校长谢谢!IDE没有像C或Java那样列出与接口不匹配的方法,这让我很恼火。有没有办法实现这一点,或者这是C++的编译器复杂性所固有的?没问题。我不是C++开发人员,我已经超过七年没有使用VC++了,所以我恐怕无法评论获得这些信息-别人可能能告诉你-我肯定会认为这是输出表。IDE没有像C或Java那样列出与接口不匹配的方法,这让我很恼火。有没有办法实现这一点,或者这是C++的编译器复杂性所固有的?没问题。我不是C++开发人员,我已经超过七年没有使用VC++了,所以我恐怕无法评论获得这些信息-别人可能能告诉你-我肯定会认为这是可以输出的。