为什么C ++ / CLI在运行时失败而不为非匹配方法编译

时间:2014-05-01 09:07:03

标签: c++ c++-cli

我想知道为什么我的下面的例子编译,但在运行时失败?实现接口的类有点不同。 DoSomething实现采用const int,而在接口中它只是一个int。编译器应该提供错误,或者运行时应该允许这样做,因为我相信const信息可以在运行时被忽略。

#include "stdafx.h"

using namespace System;

public interface class IFancyStuff
{
  void DoSomething(int x);
};

public ref class FancyClass : public IFancyStuff
{
public:
  virtual void DoSomething(const int x)
  {
    Console::WriteLine("hello world");  
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  IFancyStuff ^fc = gcnew FancyClass();
  fc->DoSomething(42);
  return 0;
}

此代码编译,但在运行时失败。运行时出错:

Unhandled Exception: System.TypeLoadException: Method 'DoSomething' in type 'FancyClass' from assembly 'CppCli, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
   at wmain(Int32 argc, Char** argv)
   at _wmainCRTStartup()

/勒

1 个答案:

答案 0 :(得分:0)

你的继承方式错误。

您还需要实际实现专门的方法来调用基本方法。

应该是

#include "stdafx.h"

using namespace System;


public ref class FancyClass 
{
public:
  virtual void DoSomething(const int x)
  {
    Console::WriteLine("hello world");  
  }
};

public interface class IFancyStuff : public FancyClass
{
  void DoSomething(int x) {
      FancyClass::DoSomething( x );
   }

};


int _tmain(int argc, _TCHAR* argv[])
{
  IFancyStuff ^fc = gcnew FancyClass();
  fc->DoSomething(42);
  return 0;
}