我有这个问题:
// the classes
class cBase {};
class cDerived : public cBase {};
class cBaseArray
{
// the array of pointers to cBase
cBase** array;
// overloaded operator that returns an element of the array
cBase*& operator[](unsigned index)
{
// much more complicated, but simplified for example
return array[index];
}
};
class cDerivedArray : public cBaseArray
{
// overloaded operator that returns a converted element of the array
cDerived*& operator[](unsigned index)
{
// conversion required, but don't know how
return static_cast<???>(cBaseArray::operator[](index));
}
};
那么如何将对cBase
operator[]
返回的指针转换为cBaseArray
,以引用cDerived
指向operator[]
的指针。 1 {} cDerivedArray
?
答案 0 :(得分:3)
你必须dynamic_cast
他们。
答案 1 :(得分:1)
要返回引用,它必须是对特定对象的引用。 cDerived*&
必须引用实际的cDerived*
(即它必须是左值)。由于您没有任何cDerived*
,因此无法返回对其中一个的引用。
如果您不需要支持语法myDerived[4] = anotherPtr;
,那么您可以返回cDerived *
,这没问题。如果你必须返回一个引用,那么除了返回cBase *&
之外你没有简单的选择,并且如果他们想要访问那些无法通过{访问的内容,则要求调用者对结果执行dynamic_cast<>
{1}}。
可以设计cBase *
返回并保留对cDerived::operator[]
的引用的特殊对象;并且该对象定义了cBase *
,可以使用operator=
,并且该对象具有转化运算符cDerived *
。这是增加的复杂性,我建议不要这样做,除非你真的不满意我前一段的解决方案
NB。要获得多态行为,你必须使cDerived *
具有多态性,即至少包含一个虚函数 - 我假设你打算这样做,但为了简洁而将它留下来。