Errore del compilatore C2259
'class': impossibile creare un'istanza di classe astratta
Il codice dichiara un'istanza di una classe o una struttura astratta.
Non è possibile creare un'istanza di una classe o di una struttura con una o più funzioni virtuali pure. Per creare un'istanza di oggetti di una classe derivata, la classe derivata deve eseguire l'override di ogni funzione virtuale pura.
Per altre informazioni, vedere Classi astratte in modo implicito.
L'esempio seguente genera l'errore 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()
Ogni volta che si deriva da un'interfaccia e si implementano i metodi di interfaccia nella classe derivata con autorizzazioni di accesso diverse public
da , è possibile ricevere C2259. L'errore si verifica perché il compilatore prevede che i metodi di interfaccia implementati nella classe derivata abbiano public
accesso.
Per risolvere questo problema, non usare autorizzazioni di accesso più restrittive per i metodi di implementazione. Il compilatore non li considera come implementazioni per i metodi di interfaccia definiti nell'interfaccia. A sua volta, che rende la classe derivata una classe astratta. Impostare invece le autorizzazioni public
di accesso per i metodi implementati.
C2259 può verificarsi anche a causa del lavoro di conformità eseguito in Visual Studio 2005, /Zc:wchar_t
ora è attivo per impostazione predefinita. In questo caso, C2599 può essere risolto compilando con /Zc:wchar_t-
, per ottenere il comportamento dalle versioni precedenti o preferibilmente aggiornando i tipi in modo che siano compatibili. Per altre informazioni, vedere /Zc:wchar_t
(wchar_t è un tipo nativo).
L'esempio seguente genera l'errore 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'esempio seguente genera l'errore 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
}