Поделиться через


Ошибка компилятора 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 методов.

C2259 также может возникать из-за работы соответствия, которая была выполнена в Visual Studio 2005, /Zc:wchar_t теперь включена по умолчанию. В этой ситуации C2599 можно разрешить либо путем компиляции с /Zc:wchar_t-помощью компиляции, чтобы получить поведение из предыдущих версий или предпочтительнее, обновив типы, чтобы они были совместимы. Дополнительные сведения см. в разделе /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
}