派生类中构造函数与虚构函数的研究
生活随笔
收集整理的這篇文章主要介紹了
派生类中构造函数与虚构函数的研究
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.繼承過程中的構造函數
A:繼承與派生過程中,基類的構造函數不能被繼承,派生類中需要聲明自己的構造函數。 B:聲明構造函數時,只需要對本類中新增成員進行初始化。至于基類繼承過來的成員,應該調用基類的構造函數來完成 C:需要強調的是,派生類的構造函數需要給基類的構造函數傳遞參數1.1 單一繼承時的構造函數
基本公式: 派生類名(基類所需要的形參,派生類成員所需的形參):基類名(參數表) { 本類成員初始化賦值語句; } #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() //自動調用基類B的默認構造函數 { c=0; cout<<"C's default constructor called."<<endl; } C::C(int i,int j):B(i) //顯式調用基類B的含有參數的構造函數 { 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; } void main() { C cc;C obj(5,6); obj.Print(); } 運行結果:1.2 多繼承時的構造函數
基本公式: 派生類名(基類1形參,基類2形參,...,基類n形參,本類形參):基類名1(參數),基類名2(參數),...,基類名n(參數) { 本類新增參數進行賦值; } #include <iostream> using namespace std;class B1{ public: B1(int i) {cout<<"constructing B1 "<<i<<endl;} }; class B2{ public:B2(int j) {cout<<"constructing B2 "<<j<<endl;} }; class B3{ public:B3() {cout<<"constructing B3 *"<<endl;} }; /// class C: public B1, public B2, public B3{ public:C(int a,int b, int c,int d):memobj1(c),B1(a),B2(b),memobj2(d) {} private:B2 memobj2;B1 memobj1;B3 memobj3; }; void main() {C obj(1,2,3,4); }運行結果:1.3 派生類中構造函數的調用次序
A:調用基類構造函數,調用順序按照他們被繼承時聲明的順序 B:調用成員對象的構造函數,調用順序按照他們在類中聲明的順序 C:執行派生類構造函數中的內容1.4 派生類中的構造函數
A:若建立派生類對象時調用了缺省的拷貝構造函數,則編譯器將自動調用基類缺省的拷貝構造函數 B: ? 若編寫派生類的拷貝構造函數,則需要為基類相應的拷貝構造函數傳遞參數,例如C(C &c1):B(c1) {}2.繼承時的析構函數
A:基類的析構函數也不能被繼承,派生類需要自行聲明 B:聲明的方法與一般(無繼承關系)類的析構函數相同 C:不需要顯式地調用基類的析構函數,系統會自動的隱式調用 D:析構函數的調用次序與構造函數相反 #include <iostream> using namespace std;class B1{ public: B1(int i) {cout<<"constructing B1 "<<i<<endl;}~B1() {cout<<"destructing B1 "<<endl;} }; class B2{ public:B2(int j) {cout<<"constructing B2 "<<j<<endl;}~B2() {cout<<"destructing B2 "<<endl;} }; class B3{ public:B3() {cout<<"constructing B3 *"<<endl;}~B3() {cout<<"destructing B3 "<<endl;} }; /// class C: public B1, public B2, public B3{ public:C(int a,int b, int c,int d):memobj1(c),B1(a),B2(b),memobj2(d) {cout<<"constructing C "<<endl;} private:B2 memobj2;B1 memobj1;B3 memobj3; }; void main() {C obj(1,2,3,4); }運行結果:總結
以上是生活随笔為你收集整理的派生类中构造函数与虚构函数的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书10048错误的解决
- 下一篇: 飞鸽传书2007 一个自己开发的软件