Erreur du compilateur C2259

'class' : impossible d’instancier la classe abstraite

Le code déclare une instance d’une classe ou d’une structure abstraite.

Vous ne pouvez pas instancier une classe ou une structure avec une ou plusieurs fonctions virtuelles pures. Pour instancier des objets d’une classe dérivée, la classe dérivée doit remplacer chaque fonction virtuelle pure.

Pour plus d’informations, consultez Classes abstraites implicitement.

L’exemple suivant génère l’erreur 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()

Chaque fois que vous dérivez d’une interface et implémentez les méthodes d’interface dans la classe dérivée avec des autorisations d’accès autres que public, vous pouvez recevoir C2259. L’erreur se produit parce que le compilateur s’attend à ce que les méthodes d’interface implémentées dans la classe dérivée aient public accès.

Pour résoudre ce problème, n’utilisez pas d’autorisations d’accès plus restrictives pour les méthodes d’implémentation. Le compilateur ne les considère pas comme des implémentations pour les méthodes d’interface définies dans l’interface. À son tour, cela rend la classe dérivée une classe abstraite. Au lieu de cela, définissez les autorisations d’accès public pour les méthodes implémentées.

C2259 peut également se produire en raison du travail de conformité effectué dans Visual Studio 2005, /Zc:wchar_t est désormais activé par défaut. Dans ce cas, L’erreur C2599 peut être résolue en compilez avec /Zc:wchar_t-, pour obtenir le comportement des versions précédentes, ou de préférence, en mettant à jour vos types afin qu’ils soient compatibles. Pour plus d’informations, consultez /Zc:wchar_t (wchar_t type natif).

L’exemple suivant génère l’erreur 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;

L’exemple suivant génère l’erreur 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
}