编译器错误 C2259

“class”: 无法实例化抽象类

代码声明一个抽象类或结构的实例。

不能用一个或多个纯虚函数来实例化一个类或结构。 若要实例化派生类的对象,派生类必须覆盖每个纯虚函数。

有关详细信息,请参阅隐式抽象类

以下示例生成 C2259:

// C2259.cpp
// compile with: /c
class V {
public:
   void virtual func() = 0;
};
class A : public V {};
class B : public V {
public:
   void func();
};
V v;  // C2259, V is an abstract class
A a;  // C2259, A inherits func() as pure virtual
B b;  // OK, B defines func()

每当从接口派生并在派生类中以 public 以外的访问权限实现接口方法时,可能会收到 C2259。 发生错误是因为编译器希望派生类中实现的接口方法具有 public 访问权限。

若要解决此问题,请不要对实现方法使用更严格的访问权限。 编译器不会将它们视为接口中定义的接口方法的实现。 反过来,这使得派生类成为抽象类。 相反,为已实现的方法设置访问权限 public

由于在 Visual Studio 2005 中完成的一致性工作,C2259 也可能发生,现在默认启用 /Zc:wchar_t。 在这种情况下,可以通过使用 /Zc:wchar_t- 进行编译来解决 C2599,以从以前的版本中获取行为,或者最好通过更新类型以使其兼容。 有关详细信息,请参阅 /Zc:wchar_t(wchar_t 是本机类型)

以下示例生成 C2259:

// C2259b.cpp
// compile with: /c
#include <windows.h>

class MyClass {
public:
   // WCHAR now typedef'ed to wchar_t
   virtual void func(WCHAR*) = 0;
};

class MyClass2 : MyClass {
public:
   void func(unsigned short*);
};

MyClass2 x;   // C2259

// OK
class MyClass3 {
public:
   virtual void func(WCHAR*) = 0;
   virtual void func2(wchar_t*) = 0;
   virtual void func3(unsigned short*) = 0;
};

class MyClass4 : MyClass3 {
public:
   void func(WCHAR*) {}
   void func2(wchar_t*) {}
   void func3(unsigned short*) {}
};

MyClass4 y;

以下示例生成 C2259:

// C2259c.cpp
// compile with: /clr
interface class MyInterface {
   void MyMethod();
};

ref class MyDerivedClass: public MyInterface {
private:
   // Uncomment the following line to resolve.
   // public:
   virtual void MyMethod(){}
};

int main() {
   MyDerivedClass^ instance = gcnew MyDerivedClass; // C2259
}