重写虚拟函数返回类型不同,并且不是协变的

overriding virtual function return type differs and is not covariant

本文关键字:虚拟 函数 返回类型 重写      更新时间:2023-10-16

我已经将我的应用程序从32位平台移植到64位平台,并遇到了各种构建问题。我几乎解决了所有的问题,但我遇到了一个无法解决的错误。

有人能就解决这个错误提出建议吗?

"错误61错误C2555:"CICEVisionDlg::DoModal":重写虚拟函数返回类型与"CDialog::DoModal"

DoModal超控代码:

int CICEVisionDlg::DoModal() 
{ 
  int nRet; 
  m_bPopup = TRUE; 
  CEXTDLLState EXTDLLState(m_hResDllModule); 
  nRet = CDialog::DoModal(); 
  m_bPopup = FALSE; 
  return nRet; 
}

DoModal的返回值为INT_PTR,在32位平台上只是int,在64位平台上是__int64。将重写函数的返回值更改为INT_PTR,它将在两者上进行编译。

重写虚拟函数时,必须返回正确的类型,其中"correct"取决于基类的返回类型。

"正确"表示完全相同的类型,或者仅具有指针和引用返回类型的"更具体"类型。如果基类Base中的函数返回X*,则派生类可以返回不同类型的Y*,前提是YX的派生类。

您的问题是派生类CICEVisionDlgDoModal函数的重写与它正在重写的CDialog中函数的返回类型不匹配。它是否被认为是协变的取决于返回类型——如果它无论如何都不是协变的,那么你可以忽略它,错误意味着"你的函数返回了错误的类型!"