C++ 开始C++;问题无法实例化抽象类(VS中的C2259)

C++ 开始C++;问题无法实例化抽象类(VS中的C2259),c++,windows,com,C++,Windows,Com,我正在尝试创建IAudioEvents COM接口的一个具体实例(在Vista和更高版本中提供)。这是我第一次涉足COM编程,所以我可能只是在做一些愚蠢的事情。无论如何,以下代码无法使用“C2259:“AudioEndpointVolumeNotifierImpl:无法实例化抽象类”进行编译 类别定义(AudioEndpointVolumeNotifierImpl.h): 对应的cpp: HRESULT STDMETHODCALLTYPE AudioEndpointVolumeNotifierI

我正在尝试创建IAudioEvents COM接口的一个具体实例(在Vista和更高版本中提供)。这是我第一次涉足COM编程,所以我可能只是在做一些愚蠢的事情。无论如何,以下代码无法使用“C2259:“AudioEndpointVolumeNotifierImpl:无法实例化抽象类”进行编译

类别定义(AudioEndpointVolumeNotifierImpl.h):

对应的cpp:

HRESULT STDMETHODCALLTYPE AudioEndpointVolumeNotifierImpl::OnSimpleVolumeChanged(float NewVolume, BOOL NewMute, LPCGUID EventContext)
{
    PostStatusChange(NewVolume);

    return S_OK;
}
在以下代码的IClassFactory实例中失败:

...
AudioEndpointVolumeNotifierImpl* pObject = new AudioEndpointVolumeNotifierImpl();
    if (pObject == NULL)
    {
        return E_OUTOFMEMORY ;
    }
...
这段代码的大部分来自一些教程(特别是IUnknown)。我并不期望这段代码能够正常工作,但我不明白为什么它不能编译


谢谢。

奇怪的是,尽管
OnIconPathChanged
被描述为在此处使用
LPWCHAR
参数:

下面的示例中显示了使用
LPCWSTR

其中一个可能是错误的;如果我们假设它是前者,并且该方法实际上采用了一个
LPCWSTR
(这在上下文中更有意义),那么就可以解释您的错误。我会尝试将您的声明更改为

HRESULT STDMETHODCALLTYPE OnIconPathChanged(LPCWSTR NewIconPath, LPCGUID EventContext){return S_OK;}

除了埃里克·梅尔斯基的回答(因为你说你是初学者,我想他的回答你可能不太清楚):

出现此错误的原因是AudioEndpointVolumeNotifierImpl是一个抽象类,这意味着它有纯虚拟方法,可以直接在类中定义,也可以从基类继承

就你而言,显然是后者


您要做的是实现继承的纯虚拟方法,这是您尝试过的,但是如果方法的签名不同,您只需定义一个重载,并保持基本纯虚拟方法不变。你的课还是抽象的。因此出现了错误消息。

当您收到此错误时,您通常可以在输出控制台(即不是错误列表)中查找“由于以下成员:”并且您将看到使类抽象的原因。

我建议查看编译日志(“输出”窗口)。它通常打印您错过的方法的名称。。。
HRESULT STDMETHODCALLTYPE OnIconPathChanged(LPCWSTR NewIconPath, LPCGUID EventContext){return S_OK;}