c ++基类和派生类约束

时间:2013-01-25 14:15:15

标签: c++

以下问题可能看似重复,但我无法在网站的其他任何位置找到确切的想法。

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

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

假设您有以下几行:

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的类型。我可以使用不完整类型C&在A函数的原型中,但我无法返回C类型的对象。

提前谢谢你, SyndicatorBBB

1 个答案:

答案 0 :(得分: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声明显式取消隐藏运算符。