簡體   English   中英

使用不同的返回類型覆蓋虛函數會引發私有繼承的錯誤

[英]Overriding the virtual functions with different return types raises error with private inheritance

在以下代碼中,我得到以下編譯錯誤:

1>c:\users\mittamani\desktop\06-10\over_riding_test\over_riding_test\over_riding_test.cpp(33) : error C2555: '_D1::fun': overriding virtual function return type differs and is not covariant from 'Base2::fun'
1>        c:\users\mittamani\desktop\06-10\over_riding_test\over_riding_test\over_riding_test.cpp(28) : see declaration of 'Base2::fun'
1>        'Base1' : base class is not accessible
1>c:\users\mittamani\desktop\06-10\over_riding_test\over_riding_test\over_riding_test.cpp(37) : error C2555: '_D2::fun': overriding virtual function return type differs and is not covariant from 'Base2::fun'
1>        c:\users\mittamani\desktop\06-10\over_riding_test\over_riding_test\over_riding_test.cpp(28) : see declaration of 'Base2::fun'
1>        'Base1' : base class is not accessible
1>Build log was saved at "file://c:\Users\mittamani\Desktop\06-10\Over_riding_Test\Over_riding_Test\Debug\BuildLog.htm"
1>Over_riding_Test - 2 error(s), 0 warning(s)

這是代碼:

class Base1{
public:
    Base1(){}
    virtual ~Base1(){}
};

class D1:Base1{

};

class D2:Base1{

};

class Base2{
public:
    Base2(){}
    virtual ~Base2(){}
    virtual Base1 * fun() = 0;
};

class _D1:Base2{
public:
    D1* fun(){}
};

class _D2:Base2{
public:
    D2* fun(){}
};

順便說一下,我對C ++更新..請幫助..謝謝提前..

假設您嘗試使用返回類型的協方差 ,您的嘗試是有效的,除了類型必須使用公共繼承的事實:

class D1:public Base1{
//       ~~~~~^

};

class D2:public Base1{
//       ~~~~~^    
};

class _D1 : Base2{
public:
    D1* fun(){} // ok now, D1 inherits publicly from Base1
};

class _D2 : Base2{
public:
    D2* fun(){} // ok now, D2 inherits publicly from Base1
};

就像你不能將D2*Base1*除非你使用公共繼承,這同樣適用於此。

DEMO


或者,您必須使這些類成為朋友,以便他們可以訪問私有基類:

class _D1;
class _D2;

class D1 : Base1{
    friend class _D1;
};

class D2 : Base1{
    friend class _D2;
};

C ++標准參考:

[class.virtual]虛函數[class.virtual]

  1. 重寫函數的返回類型應與重寫函數的返回類型相同,或者與函數類的協變相同。 如果函數D::f覆蓋函數B::f ,則函數的返回類型如果滿足以下條件則是協變的:

    - 兩者都是指向類的指針,都是對類的左值引用,或者兩者都是對類的右值引用

    - 返回類型B::f中的類與D::f的返回類型中的類相同,或者是D::f類的返回類型中類的明確且可訪問的直接或間接基類D::f

    - 指針或引用都具有相同的cv限定,並且返回類型D::f中的類類型具有與B::f的返回類型中的類類型相同的cv-qualification或更少的cv-qualification。

重寫函數的返回類型應與重寫函數的返回類型相同,或者與函數類的協變相同。 如果函數D :: f覆蓋函數B :: f,則函數的返回類型如果滿足以下條件則是協變的:

- 指向類或類的引用的指針
-B :: f的返回類型中的類與D :: f的返回類型中的類相同,或者是D :: f的返回類型中類的明確的直接或間接基類並且可以在D中訪問
-both指針或引用具有相同的cv限定,並且返回類型D :: f中的類類型具有與b :: f的返回類型中的類類型相同的cv-qualification或更少的cv-qualification。

您必須更改所有fun()以返回Base1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM