程序如下:
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不能訪問?
以后該父類做的事情,還是由父類來做吧。