一、相關(guān)問題: 1. 基類、派生類的構(gòu)造和析構(gòu)順序 2. 基類、派生類中virtual的取舍 二、測(cè)試代碼: #include <iostream> class A { public: A() { std::cout << "A()" << std::endl; } virtual void print() { std::cout << "A print()" << std::endl; } virtual ~A() { std::cout << "~A()" << std::endl; } }; class B : public A { public: B() : A(){ std::cout << "B()" << std::endl; } virtual void print() { std::cout << "B print()" << std::endl; } virtual ~B() { std::cout << "~B()" << std::endl; } }; void print() { } int main(int argc, char *argv[]) { A* c = new B(); c->print(); delete c; return 0; } 三、探討與結(jié)論: 1. 基類、派生類的構(gòu)造和析構(gòu)順序?yàn)椋?strong>基類構(gòu)造-派生類構(gòu)造-派生類析構(gòu)-基類析構(gòu) 上述代碼輸出結(jié)果為: 2. 基類、派生類中virtual的取舍:若要實(shí)現(xiàn)動(dòng)態(tài)綁定,基類中virtual關(guān)鍵字不可舍棄,派生類中virtual關(guān)鍵字可有可無;若基類中有關(guān)鍵字virtual,則普通函數(shù)調(diào)用派生類函數(shù),析構(gòu)函數(shù)先調(diào)用派生類,再調(diào)用基類;若基類中無關(guān)鍵字virtual,則普通函數(shù)和析構(gòu)函數(shù)均只調(diào)用基類函數(shù)。 測(cè)試代碼1:基類無關(guān)鍵字virtual #include <iostream> class A { public: A() { std::cout << "A()" << std::endl; } void print() { std::cout << "A print()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } }; class B : public A { public: B() : A(){ std::cout << "B()" << std::endl; } virtual void print() { std::cout << "B print()" << std::endl; } virtual ~B() { std::cout << "~B()" << std::endl; } }; void print() { } int main(int argc, char *argv[]) { A* c = new B(); c->print(); delete c; return 0; } 輸出結(jié)果為: 測(cè)試代碼2:派生類無關(guān)鍵字virtual #include <iostream> class A { public: A() { std::cout << "A()" << std::endl; } virtual void print() { std::cout << "A print()" << std::endl; } virtual ~A() { std::cout << "~A()" << std::endl; } }; class B : public A { public: B() : A(){ std::cout << "B()" << std::endl; } void print() { std::cout << "B print()" << std::endl; } ~B() { std::cout << "~B()" << std::endl; } }; void print() { } int main(int argc, char *argv[]) { A* c = new B(); c->print(); delete c; return 0; } 輸出結(jié)果為: |
|