指针 return 问题的 c++ 协方差问题

c++ Covariance issue with pointer return issue

由于我的post中有很多歧义,我会重做。 这是我在从 visual studio 6.0 环境升级到 visual studio 2012 环境的项目中遇到的问题。

我有一个 class 派生自包含以下函数的 followinh mfc class (CPropertyPage)。文件是 afxdlgs.h (mfc class)

class CPropertyPage : public CDialog
{
public:
virtual CPropertySheet *GetParentSheet();
}

我在更改前向声明后似乎仍然有问题。这是由于我的错误表述导致的结果。所以我把它改回了原来的形式。

派生的 class 看起来像这样。 header

class CBankDefImportSheet;
class CBankDefImportAssignPage : public CPropertyPage
{
protected:
    CBankDefImportSheet* GetParentSheet ();
}

在 cpp 中

#include "BankDefImportSheet.h"
CBankDefImportSheet* CBankDefImportAssignPage::GetParentSheet()
{
    return (CBankDefImportSheet *)GetParent ();
}

此外,CBangDefImportSheet 是

class CBankDefImportSheet : public CPropertySheet
{}

编译时出现 C2555 错误,指出 return 类型与 CPropertyPage::GetParentSheet 不同且不协变。

我试过添加 CBankDefImportSheet 的 header 但这并没有解决问题。我还阅读了能够在 return 类型之后进行转换的可能性,但不确定这是否会解决它,而且不确定在这种情况下该怎么做。

编辑:解决后,下面的 post 是问题的一部分,然而,const 的正确性也是如此。我真丢人!

在header中应该指定为

 CBankDefImportSheet * GetParentSheet () const;

此外在 cpp

 CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
 {
     return ((CBankDefImportSheet *)GetParent ());
 }

编译器需要在声明 CDefImportSheetPage::GetParentSheet() 时(您标记 .h 的地方)知道 CDefImportSheet 继承自 CPropertySheet

它无法从像这样的简单前向声明中获取该信息:

class CDefImportSheet;

您需要在此处包含 CDefImportSheet 的 header。

我在编辑中回答了我自己的问题,但根据建议我也将其添加到此处。我的问题的主要原因是 mfc 对话框函数是常量。因此由于 const 正确性(或在这种情况下不正确)导致错误的协方差

CBankDefImportSheet* GetParentSheet ();

在header中应该指定为

CBankDefImportSheet * GetParentSheet () const;

此外在 cpp

CBankDefImportSheet * CBankDefImportAssignPage::GetParentSheet() const
{
return ((CBankDefImportSheet *)GetParent ());
}

我很高兴这至少已经帮助了另外一个人。