コンパイラ エラー C2259
'class' : 抽象クラスをインスタンス化できません
抽象クラスまたは抽象構造体のインスタンスが宣言されています。
1 つ以上の純粋仮想関数を持つクラスまたは構造体をインスタンス化することはできません。 派生クラスのオブジェクトをインスタンス化するには、派生クラスが各純粋仮想関数をオーバーライドする必要があります。
詳細については、暗黙的な抽象クラスに関するページを参照してください。
次の例では 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()
インターフェイスから派生して、public
以外のアクセス許可を持つインターフェイス メソッドを派生クラスに実装する場合は、常に C2259 が発生する可能性があります。 このエラーは、コンパイラでは、派生クラスに実装されたインターフェイス メソッドは public
アクセスを持つことが想定されているために発生します。
この問題を解決するには、実装メソッドに対してより制限の厳しいアクセス許可を使用しないでください。 コンパイラでは、これらがインターフェイスで定義されているインターフェイス メソッドの実装として考慮されません。 それにより、派生クラスは抽象クラスになります。 実装されるメソッドのアクセス許可を public
にします。
C2259 は、Visual Studio 2005 で行った準拠作業で、/Zc:wchar_t
が既定でオンになったため発生することもあります。 この場合に C2599 エラーを解決するには、/Zc:wchar_t-
でコンパイルすることによって以前のバージョンの動作を指定します。または可能であれば、互換性を維持できるように型を更新します。 詳細については、「/Zc:wchar_t
(wchar_t をネイティブ型として認識)」を参照してください。
次の例では 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;
次の例では 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
}