Part7 继承与派生 7.4派生类的构造和析构
1派生類(lèi)的構(gòu)造函數(shù)
默認(rèn)情況下:基類(lèi)的構(gòu)造函數(shù)不被繼承,派生類(lèi)需要定義自己的構(gòu)造函數(shù)。
C++11 規(guī)定:可用using語(yǔ)句繼承基類(lèi)構(gòu)造函數(shù)。但是只能初始化從基類(lèi)繼承的成員。這時(shí)派生類(lèi)新增成員可以通過(guò)類(lèi)內(nèi)初始值進(jìn)行初始化。
建議:如果派生類(lèi)有自己新增的成員,且需要通過(guò)構(gòu)造函數(shù)初始化,則派生類(lèi)要自定義構(gòu)造函數(shù)。
若不繼承基類(lèi)的構(gòu)造函數(shù):
繼承來(lái)的成員:自動(dòng)調(diào)用基類(lèi)構(gòu)造函數(shù)進(jìn)行初始化
派生類(lèi)的構(gòu)造函數(shù)需要給基類(lèi)的構(gòu)造函數(shù)傳遞參數(shù)。
單繼承(派生類(lèi)只有一個(gè)直接基類(lèi)的情況)時(shí)構(gòu)造函數(shù)的定義語(yǔ)法:
派生類(lèi)名::派生類(lèi)名(基類(lèi)所需的形參,本類(lèi)成員所需的形參):
基類(lèi)名(參數(shù)表), 本類(lèi)成員初始化列表
{
//其他初始化;
};
?
//單繼承時(shí)的構(gòu)造函數(shù)舉例 #include<iostream> using namespace std; class B{ public:B();B(int i);~B();void print() const; private:int b; }; B::B(){b = 0;cout << "B's default constructor called." << endl; } B::B(int i){b = i;cout << "B's constructor called." << endl; } B::~B(){cout << "B's destructor called." << endl; } void B::print() const{cout << b << endl; } class C: public B{ public:C();C(int i, int j);~C();void print() const; private:int c; }; C::C(){c = 0;cout << "C's default contructor called." << endl; } C::C(int i, int j):B(i),c(j){cout << "C's constructor called." << endl; } C::~C(){cout << "C's destructor called." << endl; } void C::print() const{B::print();cout << c << endl; } int main(){C obj(5,6);obj.print();return 0; }?
構(gòu)造函數(shù)的執(zhí)行順序:
1 調(diào)用基類(lèi)構(gòu)造函數(shù)。
順序按照它們被繼承時(shí)聲明的順序(從左向右)。
2 對(duì)初始化列表中的成員進(jìn)行初始化。
順序按照它們?cè)陬?lèi)中定義的順序。
對(duì)象成員初始化時(shí)自動(dòng)調(diào)用其所屬類(lèi)的構(gòu)造函數(shù)。由初始化列表提供參數(shù)。
3 執(zhí)行派生類(lèi)的構(gòu)造函數(shù)體中的內(nèi)容。
?
?
2派生類(lèi)構(gòu)造函數(shù)舉例
//7-4派生類(lèi)構(gòu)造函數(shù)舉例 #include<iostream> using namespace std; class Base1{//基類(lèi)1,構(gòu)造函數(shù)有參數(shù) public:Base1(int i){cout << "Constructing Base1 " << i << endl;} }; class Base2{//基類(lèi)2,構(gòu)造函數(shù)有參數(shù) public:Base2(int j){cout << "Constructing Base2 " << j << endl;} }; class Base3{//基類(lèi)3,構(gòu)造函數(shù)無(wú)參數(shù) public:Base3(){cout << "Constructing Base3 *" << endl; } }; class Derived: public Base2, public Base1, public Base3{ public:Derived(int a, int b, int c, int d):Base1(a), member2(d), member1(c), Base2(b){}//此處的次序與構(gòu)造函數(shù)的執(zhí)行次序無(wú)關(guān) private://派生類(lèi)的私有對(duì)象成員 Base1 member1;Base2 member2;Base3 member3; }; int main(){Derived obj(1,2,3,4);return 0; }?
?
?
3派生類(lèi)復(fù)制構(gòu)造函數(shù)
派生類(lèi)未定義復(fù)制構(gòu)造函數(shù)的情況:
編譯器會(huì)在需要時(shí)生成一個(gè)隱含的復(fù)制構(gòu)造函數(shù);
這個(gè)隱含復(fù)制構(gòu)造函數(shù),先調(diào)用基類(lèi)的復(fù)制構(gòu)造函數(shù);
再為派生類(lèi)新增的成員執(zhí)行復(fù)制。
派生類(lèi)定義了復(fù)制構(gòu)造函數(shù)的情況:
一般都要為基類(lèi)的復(fù)制構(gòu)造函數(shù)傳遞參數(shù)。
復(fù)制構(gòu)造函數(shù)只能接受一個(gè)參數(shù),既用來(lái)初始化派生類(lèi)定義的成員,也將被傳遞給基類(lèi)的復(fù)制構(gòu)造函數(shù)。
基類(lèi)的復(fù)制構(gòu)造函數(shù)形參類(lèi)型是基類(lèi)對(duì)象的引用,實(shí)參可以是派生類(lèi)對(duì)象的引用
如: C::C(const C &c1): B(c1) {…}
?
?
4派生類(lèi)的析構(gòu)函數(shù)
析構(gòu)函數(shù)不被繼承,派生類(lèi)如果需要,要自行聲明析構(gòu)函數(shù)。
聲明方法與無(wú)繼承關(guān)系時(shí)類(lèi)的析構(gòu)函數(shù)相同。
不需要顯式地調(diào)用基類(lèi)的析構(gòu)函數(shù),系統(tǒng)會(huì)自動(dòng)隱式調(diào)用。
先執(zhí)行派生類(lèi)析構(gòu)函數(shù)的函數(shù)體,再調(diào)用基類(lèi)的析構(gòu)函數(shù)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/leosirius/p/8065282.html
總結(jié)
以上是生活随笔為你收集整理的Part7 继承与派生 7.4派生类的构造和析构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将sql 结果导出到文件
- 下一篇: python - HTMLTestRun