编译器错误 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
。
由于在 Visual Studio 2005 中完成的一致性工作,C2259 也可能发生,现在默认启用 /Zc:wchar_t
。 在这种情况下,可以通过使用 /Zc:wchar_t-
进行编译来解决 C2599,以从以前的版本中获取行为,或者最好通过更新类型以使其兼容。 有关详细信息,请参阅 /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
}