Erro do compilador C2259
'class': não é possível criar uma instância de classe abstrata
O código declara uma instância de uma classe ou estrutura abstrata.
Você não pode criar uma instância de uma classe ou estrutura com uma ou mais funções virtuais puras. Para criar uma instância de objetos de uma classe derivada, a classe derivada deve substituir cada função virtual pura.
Para obter mais informações, confira Classes implicitamente abstratas.
O seguinte exemplo gera o erro 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()
Sempre que você derivar de uma interface e implementar os métodos de interface na classe derivada com permissões de acesso diferentes de public
, poderá receber C2259. O erro ocorre porque o compilador espera que os métodos de interface implementados na classe derivada tenham acesso public
.
Para resolver esse problema, não use permissões de acesso mais restritivas para os métodos de implementação. O compilador não as considera como implementações para os métodos de interface definidos na interface. Por sua vez, isso torna a classe derivada uma classe abstrata. Em vez disso, faça as permissões de acesso public
para os métodos implementados.
C2259 também pode ocorrer devido ao trabalho de conformidade que foi feito no Visual Studio 2005, /Zc:wchar_t
agora está ativado por padrão. Nessa situação, C2599 pode ser resolvido compilando com /Zc:wchar_t-
, para obter o comportamento de versões anteriores ou, preferencialmente, atualizando seus tipos para que sejam compatíveis. Para obter mais informações, confira /Zc:wchar_t
(wchar_t Is Native Type).
O seguinte exemplo gera o erro 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;
O seguinte exemplo gera o erro 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
}