3.0 C++遠征:is a

4-4is_a

0.派生類Soldier繼承自基類Person

//Person.h
class Person
{
public:
    Person(string name = "Jim");
    ~Person();

    void play();
protected:
    string m_strName;
};

//Soldier.h
class Soldier : public Person
{
public:
    Soldier(string name = "James", int age = 20);

    ~Soldier();

    void work();
protected:
    int m_iAge;
};

1.派生類可以給基類賦值:

//main.cpp
int main(){
    Soldier s1;
    Person p1 = s1;
  
    return 0;
}

2.基類指針可以指向派生類(派生類可以取地址給基類):

//main.cpp
int main(){
    Soldier s1;
    Person *p2 = &s1;
  
    return 0;
}

3.把基類的指針或者是基類的對象或者是基類的引用作為函數(shù)的參數(shù)來使它可以接收所傳入的子類的對象,并且也可以傳入基類的對象

void func1(Person *p){
    ......
}

void func2(Person &p){
    ......
}

//main.cpp
int main(){
    Person p1;
    Soldier s1;
    func1(&p1);     func2(p1);
    func1(&s1);     func2(s1);
  
    return 0;
}

4.基類只能接收和訪問派生類中自己有的數(shù)據成員和成員函數(shù)

//#include "Person.h"
# include "Soldier.h"

int main() {
    Soldier soldier;
    Person person;
    person = soldier;
    person.play();

    Person *p = &soldier;
    p->play();  // 使用基類聲明的對象只能調用基類的方法
    //p->work();    // 使用基類聲明的對象不能調用派生類的方法
  
    return 0;
}

5.通過基類的指針指向派生類的對象

//#include "Person.h"
#include "Soldier.h"

int main() {
    Person *pp = new Soldier;   // 基類的指針去指向派生類的內存空間
    pp->play();
    delete pp;  // 銷毀基類的對象,執(zhí)行的是基類的析構函數(shù),派生類的內存并沒有釋放
    pp = NULL;
  
    return 0;
}
LOG:
Person::play()
James
Person::~Person()

6.為了防止內存的泄漏,此時需要用virtual關鍵字修飾析構函數(shù)。

virtual可以被繼承

給基類的析構函數(shù)加一個關鍵字virtual,使銷毀基類的對象時,可以釋放派生類的對象的內存

//Person.h
class Person
{
public:
    Person(string name = "Jim");
    virtual ~Person();  // virtual關鍵字修飾析構函數(shù)

    void play();
protected:
    string m_strName;
};

LOG:
Person::play()
James
Soldier::~Soldier()
Person::~Person()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容