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
}