#include <iostream>
class BarParent
{
    public:
        int x;
        virtual void fuz() = 0;
};

class BarChild : public BarParent
{
    public:
        BarChild(int new_x){x = new_x;}
        virtual void fuz(){}
};

class FooParent
{
    public:
        BarParent* p_barPar;
        FooParent (BarChild* new_p_bar)
        {
            p_barPar = new_p_bar;
            std::cout << p_barPar->x << std::endl;
        }
};

class FooChild: public FooParent
{
    public:
        BarChild barChild;
        FooChild(int new_x):FooParent(&barChild), barChild(new_x){}
};
int main()
{
    FooChild foo(60);

    BarChild bar(99);
    FooParent fooP(&bar);
}


输出:

-548726160
99


我理解为什么我得到这个结果(未定义的行为),在初始化之前先使用barChild。我的问题是处理此问题的“权利”是什么。

最佳答案

在这种情况下,需要固定设计而不是代码。

根据您自己的设计:


BarChild必须在FooParent之前构造。
FooParent必须在FooChild之前构造。
FooChild必须在BarChild之前构造。


当您希望FooParentFooChild都引用相同的Bar对象时(如在代码中尝试的那样),请设计父类来管理它。

一种示例解决方案:

    FooParent (BarChild* new_p_bar)
    {
        if ( new_p_bar == NULL )
           new_p_bar = new BarChild;

        p_barPar = new_p_bar;
        std::cout << p_barPar->x << std::endl;
    }


在这里,FooChild不需要它自己的该对象实例。

09-06 15:10