C++定義,繼承和虛函數

類定義方式一般有兩種

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;
}

打印:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章