指向基类构造函数中派生类的指针

时间:2014-03-19 18:20:25

标签: c++ pointers constructor hierarchical-data

(请注意,这是对我实际设计的过度简化。)

鉴于以下内容:

class CParentA;
class C_Child
public:
    C_Child(C_ParentB* parent) : m_parent(parent){}; 
    virtual ~C_Child();

    CParentB*   m_parent;

};

class C_ParentA : public C_Child
{
public:
    C_ParentA(C_GrandParent *gp) : C_Child(gp){};
    virtual ~C_ParentA(){};
}

class C_ParentB
{
public:
    C_ParentB(){};
    virtual ~C_ParentB(){};
    void    foo(){};

}

class C_GrandParent : public C_ParentB, public C_ParentA
{
public:
    C_GrandParent() : C_ParentA(this){};
    virtual ~C_GrandParent();

}


main()
{
    C_GrandParent   gp;

    gp.m_parent->foo();
}

似乎发送给孩子构造函数的parentB指针在创建祖父母时仍然无效。我曾经想过,即使父母没有完全构建,它的指针(this)仍然有效。我还尝试将ParentB作为存储在grandparent中的指针,并在grandparent构造函数中动态创建对象。但这显然有相同的结果。

FWIW:目标:grandparent有许多parents,其中一些children。一个child可能需要访问另一个childparentuncle / cousin)。我原以为将这些人都放在一位族长之下会处理家庭成员之间的大部分相互关系。在这种情况下,设置适当的指针似乎是问题所在。

1 个答案:

答案 0 :(得分:0)

首先,目前尚不清楚你在问什么,所以我只想推测。你提出的设计不起作用,所以你必须要求替代方案,但是你没有提供你想要做什么的信息。

其次,当课程A派生课程B时,我们通常会说B是基础或父级,A是派生或子级。你使用相反的术语,这是非常令人困惑的。

现在,我只假设CParentB* m_parent;中的C_Child应该引用相同的C_Child对象,视为CParentB。您不需要为此存储指针。给定C_Child& r引用或C_Child* p指针,您可以简单地分别说

dynamic_cast<CParentB&>(r)
dynamic_cast<CParentB*>(p)

如果r,p未引用CParentB对象,则两者都会以不同方式失败。 dynamic_cast允许您导航整个类层次结构,并在运行时检查转换是否有效。如果类不是多态的,则可以改为使用static_cast

在任何情况下,请记住,在派生类的任何对象完全构造之前,需要首先构造其基础。所以在此之前,避免以任何方式使用部分构造的对象,比如调用其方法尤其是虚拟对象。