2.基類和派生類間的轉換
?public繼承的派?類對象可以賦值給基類的指針/基類的引?。這?有個形象的說法叫切?或者切 割。寓意把派?類中基類那部分切出來,基類指針或引?指向的是派?類中切出來的基類那部分。
? 基類對象不能賦值給派?類對象。
? 基類的指針或者引?可以通過強制類型轉換賦值給派?類的指針或者引?。但是必須是基類的指針 是指向派?類對象時才是安全的。這?基類如果是多態類型,可以使?RTTI(Run-TimeType Information)的dynamic_cast來進?識別后進?安全轉換。
class Person
{
protected:string _name; // 姓名 string _sex; // 性別 int _age; // 年齡
};
class Student : public Person
{
public:int _No; // 學號
};
int main()
{Student sobj;// 1.派?類對象可以賦值給基類的指針/引? Person* pp = &sobj;Person& rp = sobj;// ?類對象可以賦值給基類的對象是通過調?后?會講解的基類的拷?構造完成的 Person pobj = sobj;//2.基類對象不能賦值給派?類對象,這?會編譯報錯 sobj = pobj;return 0;}
3.繼承中的作用域
3.1 隱藏規則:
1.在繼承體系中基類和派?類都有獨?的作?域。
2.派?類和基類中有同名成員,派?類成員將屏蔽基類對同名成員的直接訪問,這種情況叫隱藏。 (在派?類成員函數中,可以使?基類::基類成員顯?訪問)
3.需要注意的是如果是成員函數的隱藏,只需要函數名相同就構成隱藏。
4.注意在實際中在繼承體系??最好不要定義同名的成員。
// Student的_num和Person的_num構成隱藏關系,可以看出這樣代碼雖然能跑,但是?常容易混淆
class Person
{
protected:string _name = "?李?"; // 姓名 int _num = 111; // ?份證號
};
class Student : public Person
{
public:void Print(){cout << " 姓名:" << _name << endl;cout << " ?份證號:" << Person::_num << endl;cout << " 學號:" << _num << endl;}
protected:int _num = 999; // 學號
};
int main()
{Student s1;s1.Print();return 0;};