重写虚拟函数返回类型不同,并且不是协变的
overriding virtual function return type differs and is not covariant
我已经将我的应用程序从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*
,前提是Y
是X
的派生类。
您的问题是派生类CICEVisionDlg
中DoModal
函数的重写与它正在重写的CDialog
中函数的返回类型不匹配。它是否被认为是协变的取决于返回类型——如果它无论如何都不是协变的,那么你可以忽略它,错误意味着"你的函数返回了错误的类型!"
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数