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