Delen via


Compilerfout C2259

'klasse': kan geen abstracte klasse instantiëren

Opmerkingen

Code declareert een exemplaar van een abstracte klasse of structuur.

U kunt een klasse of structuur niet instantiëren met een of meer pure virtuele functies. Als u objecten van een afgeleide klasse wilt instantiëren, moet de afgeleide klasse elke pure virtuele functie overschrijven.

Zie Impliciet abstracte klassen voor meer informatie.

Voorbeelden

In het volgende voorbeeld wordt C2259 gegenereerd:

// 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()

Wanneer u bent afgeleid van een interface en de interfacemethoden in de afgeleide klasse implementeert met andere toegangsmachtigingen dan public, ontvangt u mogelijk C2259. De fout treedt op omdat de compiler verwacht dat de interfacemethoden die in de afgeleide klasse zijn geïmplementeerd, toegang hebben public .

U kunt dit probleem oplossen door geen meer beperkende toegangsmachtigingen te gebruiken voor de implementatiemethoden. De compiler beschouwt deze niet als implementaties voor de interfacemethoden die in de interface zijn gedefinieerd. Op zijn beurt wordt de afgeleide klasse een abstracte klasse. Maak in plaats daarvan de toegangsmachtigingen public voor de geïmplementeerde methoden.

C2259 kan ook optreden vanwege nalevingswerk dat is uitgevoerd in Visual Studio 2005, /Zc:wchar_t is nu standaard ingeschakeld. In deze situatie kan C2599 worden opgelost door te compileren met /Zc:wchar_t-, om het gedrag van eerdere versies op te halen, of bij voorkeur door uw typen bij te werken zodat ze compatibel zijn. Zie (wchar_t is systeemeigen type) voor/Zc:wchar_t meer informatie.

In het volgende voorbeeld wordt C2259 gegenereerd:

// 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;

In het volgende voorbeeld wordt C2259 gegenereerd:

// 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
}