你如何处理一个“问题”;无法实例化抽象类";C+中的错误+;? 如何处理C++中“不能实例化的抽象类”错误? 我在这里看到了一些类似的错误,但没有一个与我遇到的问题完全相同。但是,我要再次承认,有几个问题需要讨论。以下是编译错误:

你如何处理一个“问题”;无法实例化抽象类";C+中的错误+;? 如何处理C++中“不能实例化的抽象类”错误? 我在这里看到了一些类似的错误,但没有一个与我遇到的问题完全相同。但是,我要再次承认,有几个问题需要讨论。以下是编译错误:,c++,abstract-class,C++,Abstract Class,这使我进入这一页: 编译错误C2259来自C++程序,但页面调用抽象类“接口”: 当您从接口派生并在派生类中使用除public之外的访问权限实现接口方法时,您可能会收到C2259。这是因为编译器希望派生类中实现的接口方法具有公共访问权限。当您为具有更严格的访问权限的接口实现成员函数时,编译器不认为它们是接口中定义的接口方法的实现,这又使派生类成为抽象类。 此问题有两种可能的解决方法: 为实现的方法公开访问权限 对派生类中实现的接口方法使用作用域解析运算符,以接口名称限定实现的方法名称 坏消息是,

这使我进入这一页: 编译错误C2259来自C++程序,但页面调用抽象类“接口”:

当您从接口派生并在派生类中使用除public之外的访问权限实现接口方法时,您可能会收到C2259。这是因为编译器希望派生类中实现的接口方法具有公共访问权限。当您为具有更严格的访问权限的接口实现成员函数时,编译器不认为它们是接口中定义的接口方法的实现,这又使派生类成为抽象类。

此问题有两种可能的解决方法:

为实现的方法公开访问权限

对派生类中实现的接口方法使用作用域解析运算符,以接口名称限定实现的方法名称

坏消息是,我已经在类中公开了所有方法:

class AmbientOccluder: public Light {
    public:

        AmbientOccluder(void); 

该错误意味着该类的某些方法尚未实现。您无法实例化这样一个类,因此除了实现类的所有方法之外,您什么都做不了

另一方面,常见的模式是实例化一个具体类,并将其分配给abstrate基类的指针:

class Abstract { /* stuff */ 4};
class Derived : virtual public Abstract { /* implement Abstract's methods */ };

Abstract* pAbs = new Derived; // OK

只是一旁,为了避免上述行的内存管理问题,您可以考虑使用A,例如“STD::UnQuyJPTR:

std::unique_ptr<Abstract> pAbs(new Derived);
std::唯一的ptr PAB(新衍生);

抽象类不能按定义实例化。为了使用这个类,您必须创建一个具体的子类来实现该类的所有虚拟函数。在这种情况下,您很可能没有实现
Light
中声明的所有虚拟函数。这意味着
ambientocluder
默认为抽象类。为了进一步帮助您,您应该包括
Light
类的详细信息。

提供该类具有的任何纯虚拟函数的实现。

Visual Studio的错误列表窗格仅显示错误的第一行。调用
视图
输出
,我敢打赌您会看到如下内容:

c:\path\to\your\code.cpp(42): error C2259: 'AmbientOccluder' : cannot instantiate abstract class
          due to following members:
          'ULONG MysteryUnimplementedMethod(void)' : is abstract
          c:\path\to\some\include.h(8) : see declaration of 'MysteryUnimplementedMethod'

为什么我们不能创建抽象类的对象? 当我们在抽象类中创建一个纯虚函数时,我们在VTABLE中为函数保留了一个插槽(在上一个主题中进行了研究),但没有在该插槽中放置任何地址。因此VTABLE将是不完整的。 由于VTABLE for Abstract类不完整,因此编译器将不允许为此类创建对象,并在您尝试这样做时显示错误消息

纯虚拟定义

纯虚函数可以在抽象类中给出一个小的定义,您希望所有派生类都具有这个定义。仍然不能创建抽象类的对象。
此外,纯虚函数必须在类定义之外定义。如果在类定义中定义它,编译器将给出一个错误。内联纯虚拟定义是非法的。

我在这里回答了这个问题


看看它是否对某些人有帮助。

在我的例子中,我在COM控件
.idl
文件中声明了一个函数,如

[id(1)] HRESULT MyMethod([in]INT param);
但不是像这样在我的界面
.h
文件中声明的

STDMETHOD(MyMethod)(INT param);
通过将上述行添加到我的interface.h文件中,问题得以解决


这可能对某些人有所帮助。

如果有人从函数中得到此错误,请尝试在参数中使用对抽象类的引用

void something(Abstract bruh){
}


@dasblinkenlight IIRC,这是可选的。但是,后一个默认值构造对象。但这不是一个错误。另请参见:@dasblinkenlight-Hmm,不,不需要括号。@dasblinkenlight做了太多的Java和C#,不是吗?顺便问一下。为什么会有这么多的反对票?我觉得这个问题很清楚,很有条理。这是一个初学者的话题,当然,但问题是好的,我希望我能否决所有这些精英弗拉默博伊。嗯,我试着在Ambientocluder中评论所有的方法,并做了一个构建,以确保所有的方法都得到考虑。他们是。因此,在这个层面上,这并不是因为一些混合泳没有身体。我将在父类上尝试它。@xarzu如果
AmbientOcluder
有基类,也可以在那里查找未实现的方法。否则,您的编译器错误是最具误导性的@juanchopanza
AmbientCluder
继承自
Light
。要查看哪些方法尚未实现,请转到查看->输出。了解哪些方法未实现的有用提示。这应该是最重要的答案。输出窗格会告诉您哪个类/方法尚未实现。
void something(Abstract& bruh){
}