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

xar*_*rzu 18 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); 
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 34

该错误意味着该类中有一些未实现的方法.您不能实例化这样的类,因此除了实现该类的所有方法之外,您无法做任何事情.

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

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

Abstract* pAbs = new Derived; // OK
Run Code Online (Sandbox Code Playgroud)

另外,为避免上述行的内存管理问题,您可以考虑使用智能指针,例如`std :: unique_ptr:

std::unique_ptr<Abstract> pAbs(new Derived);
Run Code Online (Sandbox Code Playgroud)

  • 要查看尚未实现的方法,请转到查看-&gt;输出。 (2认同)

Oli*_*ais 27

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'
Run Code Online (Sandbox Code Playgroud)

  • 知道哪些方法没有实现的该死的有用提示。 (2认同)
  • 这应该是最佳答案。输出窗格会告诉您尚未实现的类/方法。 (2认同)

Cod*_*ice 9

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