[英]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*
除非你使用公共繼承,這同樣適用於此。
或者,您必須使這些類成為朋友,以便他們可以訪問私有基類:
class _D1;
class _D2;
class D1 : Base1{
friend class _D1;
};
class D2 : Base1{
friend class _D2;
};
C ++標准參考:
[class.virtual]
虛函數[class.virtual]
重寫函數的返回類型應與重寫函數的返回類型相同,或者與函數類的協變相同。 如果函數
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.