C ++将对基指针的引用转换为对派生指针的引用

时间:2014-06-09 09:48:06

标签: c++ pointers reference

我有这个问题:

// 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

2 个答案:

答案 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 *具有多态性,即至少包含一个虚函数 - 我假设你打算这样做,但为了简洁而将它留下来。