共用方式為


編譯器錯誤 C2259

'class' : 無法具現化抽象類

程序代碼會宣告抽象類或結構的實例。

您無法使用一或多個純虛擬函式來具現化類別或結構。 若要具現化衍生類別的物件,衍生類別必須覆寫每個純虛擬函式。

如需詳細資訊,請參閱 隱含抽象類

下列範例會產生 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
}