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

Dai*_*Dai 1 c++ abstract-class directshow

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

我实现接口的类编译好了,但是当我尝试实例化它时,编译器会引发" error C2259: 'SampleGrabberCB' : cannot instantiate abstract class".

这是我正在实现的界面:

interface ISampleGrabberCB : public IUnknown {
    virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0;
    virtual STDMETHODIMP BufferCB( double SampleTime, BYTE *pBuffer, long BufferLen ) = 0;
};
Run Code Online (Sandbox Code Playgroud)

这是我的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
};
Run Code Online (Sandbox Code Playgroud)

这是SampleGrabberCB.cpp的实现:

#include "StdAfx.h"
#include "SampleGrabberCB.h"

//SampleGrabberCB::SampleGrabberCB() {
//  _parent = NULL;
//}

SampleGrabberCB::SampleGrabberCB(DShowCaptureDevice* parent) {

    _parent = parent;
}

SampleGrabberCB::~SampleGrabberCB() {
}

STDMETHODIMP SampleGrabberCB::BufferCB(double sampleTime, BYTE *pBuffer, long bufferLen) {
    // dummy value for now
    return -50;
}

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen) {
    // dummy value for now
    return 100;
}
Run Code Online (Sandbox Code Playgroud)

这是我如何使用它:

SampleGrabberCB* callback = new SampleGrabberCB(device);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢!

Wil*_*l A 6

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