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()