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