編譯器錯誤 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
}