派生类和基类的转换
class base
{
?? ?protected:
?? ??? ?int a;
?? ?public:
?? ??? ?base() : a(1){}
?? ??? ?virtual void print () {?? ?cout << a << endl;}
};
class derived : public base
{
?? ?private:
?? ??? ?int b;
?? ??? ?virtual void print () {?? ?base::print();?? ?cout << b <<endl;?? ?}
?? ?public:
?? ??? ?derived () : b(2) {}
};
?
derived d;
base *b = &d; //OK
derived* p = b; //error
編譯器默認(rèn)情況下只在靜態(tài)的情況下檢查,所以當(dāng)把b賦給p的時(shí)候? 編譯器只知道靜態(tài)情況下b是指向基類的? 不能把基類轉(zhuǎn)換成派生類。
解決的辦法可以用dynamic_cast申請(qǐng)?jiān)谶\(yùn)行事檢查。
?
基類指針可以指向派生類,即基類與派生類的類型轉(zhuǎn)換,但不是沒有條件的,對(duì)于上例,若是非public繼承,則:
?derived d;
?base *b=&d;
上述轉(zhuǎn)換就是錯(cuò)的;因?yàn)榛惛揪筒荒茉L問派生類成員,更不用說轉(zhuǎn)換了
若通過public繼承,基類中的虛函數(shù)只要是public的,不管在派生中該函數(shù)訪問方式如何,通過動(dòng)態(tài)綁定可以訪問該函數(shù);
b->print (); //OK
d.print ();??? //error
轉(zhuǎn)載于:https://www.cnblogs.com/waynecheng/archive/2012/04/22/2464528.html
總結(jié)
- 上一篇: 网络2网络布线与数制转换
- 下一篇: 我敬你 迪克牛仔