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.把基類的指針或者是基類的對象或者是基類的引用作為函數的參數來使它可以接收所傳入的子類的對象,并且也可以傳入基類的對象
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.基類只能接收和訪問派生類中自己有的數據成員和成員函數
//#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; // 銷毀基類的對象,執行的是基類的析構函數,派生類的內存并沒有釋放pp = NULL;return 0;
}
LOG:
Person::play()
James
Person::~Person()
6.為了防止內存的泄漏,此時需要用virtual關鍵字修飾析構函數。
virtual可以被繼承
給基類的析構函數加一個關鍵字virtual,使銷毀基類的對象時,可以釋放派生類的對象的內存
//Person.h
class Person
{
public:Person(string name = "Jim");virtual ~Person(); // virtual關鍵字修飾析構函數void play();
protected:string m_strName;
};LOG:
Person::play()
James
Soldier::~Soldier()
Person::~Person()