Error del compilador C2259
"class": no se puede crear una instancia de una clase abstract
El código declara una instancia de una estructura o clase abstracta.
No se pueden crear instancias de una clase o estructura con una o varias funciones virtuales puras. Para crear instancias de objetos de una clase derivada, ésta deberá reemplazar a todas las funciones virtuales puras.
Para obtener más información, vea Clases abstractas implícitamente.
El ejemplo siguiente genera el error 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()
Siempre que derive de una interfaz e implemente los métodos de interfaz en la clase derivada con permisos de acceso distintos de public
, podrá recibir el error C2259. Esto ocurre porque el compilador espera que los métodos de interfaz implementados en la clase derivada tengan acceso public
.
Para resolver este problema, no use permisos de acceso más restrictivos para los métodos de implementación. El compilador no los considera implementaciones para los métodos de interfaz definidos en la interfaz. A su vez, esto convierte a la clase derivada en una clase abstracta. En su lugar, establezca los permisos de acceso como public
para los métodos implementados.
El error C2259 también se puede producir como resultado del trabajo de conformidad efectuado en Visual Studio 2005, /Zc:wchar_t
ahora estará activado de manera predeterminada. En esta situación, el error C2599 se puede resolver compilando con /Zc:wchar_t-
para recuperar el comportamiento de versiones anteriores, o bien, preferiblemente, actualizando los tipos para que sean compatibles. Para más información, consulte /Zc:wchar_t
(wchar_t es de tipo nativo).
El ejemplo siguiente genera el error 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;
El ejemplo siguiente genera el error 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
}