Partilhar via


Erro do compilador C2259

'classe' : não é possível instanciar classe abstrata

Observações

Code declara uma instância de uma classe ou estrutura abstrata.

Não é possível instanciar uma classe ou estrutura com uma ou mais funções virtuais puras. Para instanciar objetos de uma classe derivada, a classe derivada deve substituir cada função virtual pura.

Para obter mais informações, consulte Classes implicitamente abstratas.

Examples

O exemplo a seguir gera 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, você pode receber C2259. O erro ocorre porque o compilador espera que os métodos de interface implementados na classe derivada tenham public acesso.

Para resolver esse problema, não use permissões de acesso mais restritivas para os métodos de implementação. O compilador não os 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 public de acesso 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, de preferência, atualizando seus tipos para que eles sejam compatíveis. Para obter mais informações, consulte /Zc:wchar_t (wchar_t é tipo nativo).

O exemplo a seguir gera 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 exemplo a seguir gera 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
}