Číst v angličtině

Sdílet prostřednictvím


Chyba kompilátoru C2259

'třída' : instanci abstraktní třídy nelze vytvořit

Kód deklaruje instanci abstraktní třídy nebo struktury.

Instanci třídy nebo struktury s jednou nebo více čistě virtuálních funkcí nelze vytvořit.Chcete-li vytvořit objekty odvozené třídy, musí odvozená třída přepsat všechny čistě virtuální funkce.

Další informace naleznete v tématu Implicitně abstraktní třídy.

Následující ukázka generuje upozornění 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()

K chybě C2259 může dojít vždy, kdy je odvozováno z rozhraní a metody rozhraní jsou v odvozené třídě implementovány s přístupovým oprávněním jiným než public. K tomu dochází, protože kompilátor očekává, že metody rozhraní implementované v odvozené třídě budou mít přístup public.Jsou-li členské funkce rozhraní implementovány s více omezujícími přístupovými oprávněními, kompilátor je nepovažuje za implementace metod definovaných v rozhraní, díky čemuž se odvozená třída stává abstraktní třídou.

Existují dvě možná řešení problému:

  • Změňte přístupová oprávnění implementovaných metod na public.

  • Přiřaďte název implementované metody k názvu rozhraní použitím operátoru vyhodnocení oboru pro metody rozhraní implementované v odvozené třídě.

K chybě C2259 může dojít také v důsledku prací na shodě aplikace Visual C++ 2005 se standardy, ve výchozím nastavení je nyní zapnuta možnost /Zc:wchar_t.V tomto případě lze chybu C2599 vyřešit buď kompilací s možností /Zc:wchar_t-, čímž bude zajištěno chování z předchozích verzí, nebo spíše aktualizací typů tak, aby byly kompatibilní.Další informace naleznete v tématu /Zc:wchar_t (wchar_t je nativní typ).

Následující ukázka generuje upozornění 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;

Následující ukázka generuje upozornění C2259:

// C2259c.cpp
// compile with: /clr
interface class MyInterface {
   void MyMethod();
};

ref class MyDerivedClass: public MyInterface {
private:
   // Uncomment the following line to resolve.
   // public:
   void MyMethod(){}
   // or the following line
   // void MyInterface::MyMethod() {};
};

int main() {
   MyDerivedClass^ instance = gcnew MyDerivedClass; // C2259
}

Následující ukázka generuje upozornění C2259:

// C2259d.cpp
// compile with: /clr:oldSyntax
public __gc __interface MyInterface {
   void MyMethod();
};
      
__gc class MyDerivedClass : public MyInterface {
// Uncomment the following line to resolve.
// public:
   void MyMethod() {};
   // or the following line
   // void MyInterface::MyMethod() {};
};
      
int main() {
   MyDerivedClass *instance = new MyDerivedClass();   // C2259
}