0
#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います。初期化される前に使用されます。私の質問は、これを処理する「権利」は何ですか。

4

4 に答える 4

0

迅速で汚い解決策:

class FooChild: private BarChild, public FooParent
{
public:
        FooChild(int new_x): BarChild(new_x), FooParent(this) {}
};
于 2013-03-31T21:16:17.830 に答える