程序如下:
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不能访问?
以后该父类做的事情,还是由父类来做吧。