類定義方式一般有兩種
Base b和Base b(3);一種不帶參數,一種帶參數,這兩種實例定義會在範圍結束自動釋放。
Base *c = new Base;和Base *c = new Base(5);沒有參數可不加括號。通過new申請的類,需要手動delete釋放,否則需要關閉程序纔會釋放(說的內存泄漏是指程序一直運行期間不斷產生新的分配內存未刪除)。
繼承
- 繼承父類,父爺類帶有virtual修飾的函數,子類可選加virtual修飾 自動算虛函數。
- 子類繼承父類,父類繼承爺類,子類初始化時,先調用爺類構造,父類構造,自身構造順序。析構則相反,先析構自身的,再回溯析構父類的。
- 父類包含的函數,爺類不包含,子類則不能用爺類去引用,如dd pd; Base a=ⅆ錯誤。
- 帶純虛函數的父類則是抽象類virtual void f()=0,父類不可實例化,其子類必須對函數實現。
#include <iostream> class Base { public: Base(){ std::cout << "this Base init" << std::endl; } Base(int i) { std::cout << "Base init cout " << i << std::endl; } void print() { std::cout << "Base::print()" << std::endl; } virtual void virprint() { std::cout << "Base::virprint()" << std::endl; } }; class Derived : public Base { public: Derived(); void print() { std::cout << "Derived::print()" << std::endl; } void virprint() { std::cout << "Derived::virprint()" << std::endl; } void cpr() { std::cout << "Derived::cpr()" << std::endl; } }; class dd :public Derived { public: void virprint() { std::cout << "dd::virprint()" << std::endl; } void cpr() { std::cout << "dd::cpr()" << std::endl; } }; Derived::Derived() { std::cout << "this Derived init" << std::endl; } int main() { Base b(3);//會自動釋放 std::cout << "after this b " << std::endl; Base *c=new Base;//需要手動釋放 std::cout << "after this c " << std::endl; Base *c1; std::cout << "after this c1 " << std::endl; Derived d; dd pd; c = &b; Base* ptr = &b; // 指向基類對象 ptr->print(); // 調用基類版本 ptr->virprint(); ptr = &d; // 指向派生類對象 ptr->print(); // 調用派生類版本 ptr->virprint(); Derived* ppte = &pd; ppte->print(); ppte->virprint(); ppte->cpr(); delete c; return 0; }
打印: