Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
'Klasse': Abstrakte Klasse kann nicht instanziieren
Durch den Code wird eine Instanz einer abstrakten Klasse oder Struktur deklariert.
Sie können eine Klasse oder Struktur nicht mit einer oder mehreren reinen virtuellen Funktionen instanziieren. Damit Objekte einer abgeleiteten Klasse instanziiert werden können, muss jede rein virtuelle Funktion durch die abgeleitete Klasse überschrieben werden.
Weitere Informationen finden Sie unter Implizit abstrakte Klassen.
Im folgenden Beispiel wird C2259 generiert:
// 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()
Wenn Sie von einer Schnittstelle ableiten und die Schnittstellenmethoden in der abgeleiteten Klasse mit anderen Zugriffsberechtigungen implementieren als public
, erhalten Sie möglicherweise C2259. Der Fehler tritt auf, da der Compiler erwartet, dass die in der abgeleiteten Klasse implementierten Schnittstellenmethoden Zugriff haben public
.
Um dieses Problem zu beheben, verwenden Sie keine restriktiveren Zugriffsberechtigungen für die Implementierungsmethoden. Der Compiler berücksichtigt sie nicht als Implementierungen für die in der Schnittstelle definierten Schnittstellenmethoden. Dadurch wird die abgeleitete Klasse wiederum zu einer abstrakten Klasse. Nehmen Sie stattdessen die Zugriffsberechtigungen public
für die implementierten Methoden vor.
C2259 kann auch aufgrund der in Visual Studio 2005 durchgeführten Konformitätsarbeit auftreten, /Zc:wchar_t
ist jetzt standardmäßig aktiviert. In dieser Situation kann C2599 entweder durch Kompilieren mit /Zc:wchar_t-
, um das Verhalten aus früheren Versionen zu erhalten, oder vorzugsweise, indem Sie Ihre Typen so aktualisieren, dass sie kompatibel sind. Weitere Informationen finden Sie unter /Zc:wchar_t
(wchar_t Ist nativer Typ).
Im folgenden Beispiel wird C2259 generiert:
// 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;
Im folgenden Beispiel wird C2259 generiert:
// 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
}