你如何在C ++中处理“无法实例化抽象类”错误?

时间:2012-08-06 18:35:43

标签: c++ abstract-class

如何在C ++中处理“无法实例化抽象类”错误? 我在这里看了一些类似的错误,但它们似乎与我所拥有的完全相同或没有问题。但是,再说一次,我承认有几个要过去。这是编译错误:

[IMG]http://i67.photobucket.com/albums/h292/Athono/cannotinstantiateabstractclass.png[/IMG]

这会引导我进入这个页面: http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(C2259);k(VS.ERRORLIST)&rd=true 编译错误C2259来自C ++程序,但页面将抽象类称为“接口”:

  

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

     

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

     

为已实施的方法公开访问权限。

     

将范围解析运算符用于派生类中实现的接口方法,以使用接口名称限定已实现的方法名称。

坏消息是我已经在课堂上公开了所有方法:

class AmbientOccluder: public Light {
    public:

        AmbientOccluder(void); 

8 个答案:

答案 0 :(得分:31)

错误意味着该类中有一些未实现的方法。你无法实例化这样的类,所以除了实现类的方法的全部之外,你无法做任何事情。

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

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

Abstract* pAbs = new Derived; // OK

暂且不说,为避免上述行的内存管理问题,您可以考虑使用smart pointer,例如`std :: unique_ptr:

std::unique_ptr<Abstract> pAbs(new Derived);

答案 1 :(得分:25)

Visual Studio的错误列表窗格仅显示错误的第一行。调用View&gt; Output,我打赌你会看到类似的内容:

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'

答案 2 :(得分:9)

无法通过定义实例化抽象类。要使用此类,必须创建一个实现该类的所有虚函数的具体子类。在这种情况下,您很可能尚未实现Light中声明的所有虚函数。这意味着AmbientOccluder默认为抽象类。为了让我们进一步为您提供帮助,您应该包含Light课程的详细信息。

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

纯虚拟定义

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

答案 5 :(得分:0)

我在这里回答了这个问题.. Covariant virtual functions return type problem

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

答案 6 :(得分:0)

在我的情况下,我在COM Control .idl文件中声明了一个函数,如

[id(1)] HRESULT MyMethod([in]INT param);

但未在我的界面.h文件中声明,如此

STDMETHOD(MyMethod)(INT param);

通过在我的界面.h文件中添加以上行来解决问题

这可能对某人有所帮助。

答案 7 :(得分:0)

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

void something(Abstract bruh){
}

void something(Abstract& bruh){
}