首页 文章

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

提问于
浏览
13

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

IMGhttp://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程序,但页面调用抽象类"interface":

无论何时从接口派生并使用除public之外的访问权限实现派生类中的接口方法,您都可以收到C2259 . 发生这种情况是因为编译器期望派生类中实现的接口方法具有公共访问权限 . 当您为具有更严格的访问权限的接口实现成员函数时,编译器不会将它们视为接口中定义的接口方法的实现,这反过来又使派生类成为抽象类 . 此问题有两种可能的解决方法:对已实现的方法公开访问权限 . 将范围解析运算符用于派生类中实现的接口方法,以使用接口名称限定已实现的方法名称 .

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

class AmbientOccluder: public Light {
    public:

        AmbientOccluder(void);

7 回答

  • 23

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

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

    但没有像我这样在我的界面 .h 文件中声明

    STDMETHOD(MyMethod)(INT param);
    

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

    这可能对某人有所帮助 .

  • 1

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

    纯虚拟定义

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

  • 0

    这个错误意味着除了实现类的方法 all 之外,还有一些类的方法是你无法做到的 .

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

    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);
    
  • 8

    Visual Studio的“错误列表”窗格仅显示错误的第一行 . 调用 View > 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'
    
  • 3

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

  • 0

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

  • 30

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

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

相关问题