Part7 继承与派生 7.4派生类的构造和析构
1派生類的構造函數
默認情況下:基類的構造函數不被繼承,派生類需要定義自己的構造函數。
C++11 規定:可用using語句繼承基類構造函數。但是只能初始化從基類繼承的成員。這時派生類新增成員可以通過類內初始值進行初始化。
建議:如果派生類有自己新增的成員,且需要通過構造函數初始化,則派生類要自定義構造函數。
若不繼承基類的構造函數:
繼承來的成員:自動調用基類構造函數進行初始化
派生類的構造函數需要給基類的構造函數傳遞參數。
單繼承(派生類只有一個直接基類的情況)時構造函數的定義語法:
派生類名::派生類名(基類所需的形參,本類成員所需的形參):
基類名(參數表), 本類成員初始化列表
{
//其他初始化;
};
?
//單繼承時的構造函數舉例 #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; }?
構造函數的執行順序:
1 調用基類構造函數。
順序按照它們被繼承時聲明的順序(從左向右)。
2 對初始化列表中的成員進行初始化。
順序按照它們在類中定義的順序。
對象成員初始化時自動調用其所屬類的構造函數。由初始化列表提供參數。
3 執行派生類的構造函數體中的內容。
?
?
2派生類構造函數舉例
//7-4派生類構造函數舉例 #include<iostream> using namespace std; class Base1{//基類1,構造函數有參數 public:Base1(int i){cout << "Constructing Base1 " << i << endl;} }; class Base2{//基類2,構造函數有參數 public:Base2(int j){cout << "Constructing Base2 " << j << endl;} }; class Base3{//基類3,構造函數無參數 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){}//此處的次序與構造函數的執行次序無關 private://派生類的私有對象成員 Base1 member1;Base2 member2;Base3 member3; }; int main(){Derived obj(1,2,3,4);return 0; }?
?
?
3派生類復制構造函數
派生類未定義復制構造函數的情況:
編譯器會在需要時生成一個隱含的復制構造函數;
這個隱含復制構造函數,先調用基類的復制構造函數;
再為派生類新增的成員執行復制。
派生類定義了復制構造函數的情況:
一般都要為基類的復制構造函數傳遞參數。
復制構造函數只能接受一個參數,既用來初始化派生類定義的成員,也將被傳遞給基類的復制構造函數。
基類的復制構造函數形參類型是基類對象的引用,實參可以是派生類對象的引用
如: C::C(const C &c1): B(c1) {…}
?
?
4派生類的析構函數
析構函數不被繼承,派生類如果需要,要自行聲明析構函數。
聲明方法與無繼承關系時類的析構函數相同。
不需要顯式地調用基類的析構函數,系統會自動隱式調用。
先執行派生類析構函數的函數體,再調用基類的析構函數。
?
轉載于:https://www.cnblogs.com/leosirius/p/8065282.html
總結
以上是生活随笔為你收集整理的Part7 继承与派生 7.4派生类的构造和析构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将sql 结果导出到文件
- 下一篇: for语句 2017-03-17