以下问题可能看似重复,但我无法在网站的其他任何位置找到确切的想法。
简要介绍:这个问题在我试图理解我班级中更复杂的继承组合时提出。
在我提出问题之前的一个注意事项 - 我不会寻找某种“解决方案”,只希望与您讨论该主题并获得更好的思考。
假设您有以下几行:
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
答案 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
声明显式取消隐藏运算符。