通过下面的例子,我们来看一下基类与派生的构造函数的调用顺序。创建时先基类后派生类。销毁时先派生类后基类。
#include
<iostream>#include
<string>using namespace
std;class
CBase { string name;int
age;public
: CBase() { cout << "BASE" << endl; } ~CBase() { cout << "~BASE" << endl; } };class
CDerive :public
CBase {public
: CDerive() { cout << "DERIVE" << endl; } ~CDerive() { cout << "~DERIVE" << endl; } };int
main ( ) { CDerive d;return
0; }
当有参数时,参数必须传送给基类。注意例子中传递的方法(第8行、第19行)。
#include
<iostream>#include
<string>using namespace
std;class
CBase { string name;public
: CBase(string s) : name(s) { cout << "BASE: " << name << endl; } ~CBase() { cout << "~BASE" << endl; } };class
CDerive :public
CBase {int
age;public
: CDerive(string s,int
a) : CBase(s), age(a) { cout << "DERIVE: " << age << endl; } ~CDerive() { cout << "~DERIVE" << endl; } };int
main ( ) { CDerive d("小雅", 27);return
0; }
当有三层继承时,参数要一层一层地传递下去(第30行、第19行、第8行)。
#include
<iostream>#include
<string>using namespace
std;class
CBase { string name;public
: CBase(string s) : name(s) { cout << "BASE: " << name << endl; } ~CBase() { cout << "~BASE" << endl; } };class
CDerive :public
CBase {int
age;public
: CDerive(string s,int
a) : CBase(s), age(a) { cout << "DERIVE: " << age << endl; } ~CDerive() { cout << "~DERIVE" << endl; } };class
CSon :public
CDerive { string id;public
: CSon(string s1,int
a, string s2) : CDerive(s1, a), id(s2) { cout << "SON: " << id << endl; } ~CSon() { cout << "~SON" << endl; } };int
main ( ) { CSon s("小雅", 27, "8503026");return
0; }
多重继承时参数的传递方法和上面一样,要注意的是两个基类的顺序。决定2个基类的顺序是知27行。将27行的CBase1和CBase2的顺序交换一下,其结果中BASE1和BASE2的顺序也随之改变,与第30行无关。
#include
<iostream>#include
<string>using namespace
std;class
CBase1 { string name;public
: CBase1(string s) : name(s) { cout << "BASE1: " << name << endl; } ~CBase1() { cout << "~BASE1" << endl; } };class
CBase2 {int
age;public
: CBase2(int
a) : age(a) { cout << "BASE2: " << age << endl; } ~CBase2() { cout << "~BASE2" << endl; } };class
CDerive :public
CBase1,public
CBase2 { string id;public
: CDerive(string s1,int
a, string s2) : CBase1(s1), CBase2(a), id(s2) { cout << "DERIVE: " << id << endl; } ~CDerive() { cout << "~DERIVE" << endl; } };int
main ( ) { CDerive d("小雅", 27, "8503026");return
0; }