C++基类与派生类的构造函数
<上一节
下一节>
缺省构造函数的调用关系
通过下面的例子,我们来看一下基类与派生的构造函数的调用顺序。创建时先基类后派生类。销毁时先派生类后基类。
#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;
}
运行结果:BASE
DERIVE
~DERIVE
BASE
有参数时的传递
当有参数时,参数必须传送给基类。注意例子中传递的方法(第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;
}
运行结果:BASE:小雅
DERIVE:27
~DERIVE
~BASE
祖孙三代的参数传递
当有三层继承时,参数要一层一层地传递下去(第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;
}
运行结果:BASE:小雅
DERIVE:27
SON:8503026
~SON
~DERIVE
~BASE
多重继承的参数传递
多重继承时参数的传递方法和上面一样,要注意的是两个基类的顺序。决定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;
}
BASE1:小雅BASE2:27
DERIVE:8503026
~DERIVE
~BASE2
~BASE1
<上一节
下一节>
