Young's Blog

包子铺

使用成员初始化列表时要注意责任分明

程序如下:

 

class Parent

{

public:

    Parent()

    {

        cout<<"Parent::Parent()"<<endl;

    }

    Parent(int n)

{

m_Num=n;

           cout<<"Parent::Parent("<<n<<")"<<endl;

    }

protected:

    int m_Num;

};

 

class Child1 : public Parent

{

public:

    Child1()

        //error: class 'Child1' does not have any field named 'm_Num'

        :m_Num(10)

    {

    }

};

 

class Child2 : public Parent

{

public:

    Child2()

        //OK!这里没有什么问题

        :Parent(m_Num)

    {

    }

};

 

    虽然这样子初始化m_Num确实是不好,但是遇上了还是要想办法解决一下的。翻了一下标准,说的模棱两可的,于是做了一下修改:

 

//验证成员初始化列表和基类构造函数的优先顺序

int DisplayExpression(const char *msg)

{

    cout<<"DisplayExpression:"<<msg<<endl;

    if(msg == NULL)

        return 0;

 

    return strlen(msg);

}

 

//验证1:先打印后基类构造

class Child3 : public Parent

{

public:

    Child3()

        :m_Child3Num(DisplayExpression("Child3")),Parent(1)

    {

    }

        

private:

    int m_Child3Num;

};

 

//验证2:先基类构造,后打印

class Child4 : public Parent

{

public:

    Child4()

        :Parent(2), m_Child4Num(DisplayExpression("Child4"))

    {

    }

private:

 

    int m_Child4Num;

};

 

int main()

{

    Child3 Obj3;

    Child4 Obj4;

}


运行的结果为:

Parent::Parent(1)

DisplayExpression:Child3

Parent::Parent(2)

DisplayExpression:Child4

 

反正标准中讲得也是不清不楚的(有几个例子和这个有点类似,但又不完全一样),这里很明显,在成员初始化列表中进行初始化时,父类已经构造完毕,既然已经构造完毕,那么为什么m_Num不能访问?

以后该父类做的事情,还是由父类来做吧。

posted on 2010-06-13 15:12 Young 阅读(1240) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理