带有指针返回问题的c++协方差问题

c++ Covariance issue with pointer return issue

本文关键字:问题 c++ 方差 指针 返回      更新时间:2023-10-16

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

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

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

在更改前瞻性声明后,我似乎仍然有问题。这是由于我糟糕的配方造成的。所以我把它改回了原来的形式

派生类如下所示。标题

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错误,即返回类型不同,并且与CPropertyPage::GetParentSheet不是协变的。

我曾尝试添加CBankDefImportSheet的标头,但这并没有解决问题。我还读到了在返回类型之后进行强制转换的可能性,但不确定这是否能解决问题,而且不确定在这种情况下如何执行。

编辑:解决后,下面的帖子是问题的一部分,然而,常量正确性也是。我真可耻!

在标题中应指定为

 CBankDefImportSheet * GetParentSheet () const;

而且在cpp 中

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

编译器需要知道在声明CDefImportSheetPage::GetParentSheet()时(您已经标记了.hCDefImportSheet继承自CPropertySheet

它无法从简单的正向声明中获得这些信息,比如:

class CDefImportSheet;

您需要在那里包含CDefImportSheet的标头。

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

CBankDefImportSheet* GetParentSheet ();

在标题中应指定为

CBankDefImportSheet * GetParentSheet () const;

而且在cpp 中

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

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