0

以下问题可能看起来像重复,但我在网站的其他任何地方都找不到确切的想法。

简要介绍:当我试图在我的班级中理解更复杂的继承组合时,提出了这个问题。

在我提出问题之前请注意 - 我不寻找一种“解决方案”,只是希望与您讨论该主题并获得更好的思考。

假设您有以下几行:

class C : public B 
{
    public : 
        C (const B& b) : B (b) {}
        B& operator*() {return *this;}
};

int main() {
    A* pA = new B();
    C& c = pA -> doIt();
    *c = *pA;
    c = *pA;
    return 1;
}

这段代码并不完整,这就是全部目的——假设它确实符合并提取了这段代码中的约束。我仍然不会只是编写代码并要求您解释头顶的任何约束,而是添加我的 concreate 问题:

我们对以下行有什么限制:

C& c = pA -> doIt();

据我了解,上面的代码有一个凝视约束,即这些类的层次顺序:C 派生于 B,B 派生于 A(如果我错了,请纠正我..)

我试图在保持上面描述的层次结构的同时实际定义这些类,并且我不能让 doIt() 返回其派生类 C 的类型。我可以在 A 函数的原型中使用不完整的类型 C& 但是我无法返回 C 类型的对象。

提前谢谢你,SyndicatorBBB

4

1 回答 1

2

试试这个:

class C;

struct A
{
    C & doIt();
};

struct B : A
{
  void operator=(A const &) { }
};

class C : public B
{
public :
    using B::operator=;
    C (const B & b) : B(b) {}
    B & operator*() { return *this; }
};

C & A::doIt()
{
    static B bimpl;
    static C cimpl(bimpl);
    return cimpl;
}

请注意,隐式赋值运算符隐藏了基本版本,因此我们需要使用声明显式取消隐藏运算符using

于 2013-01-25T14:27:27.260 回答