派生类和基类的转换
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
編譯器默認情況下只在靜態的情況下檢查,所以當把b賦給p的時候? 編譯器只知道靜態情況下b是指向基類的? 不能把基類轉換成派生類。
解決的辦法可以用dynamic_cast申請在運行事檢查。
?
基類指針可以指向派生類,即基類與派生類的類型轉換,但不是沒有條件的,對于上例,若是非public繼承,則:
?derived d;
?base *b=&d;
上述轉換就是錯的;因為基類根本就不能訪問派生類成員,更不用說轉換了
若通過public繼承,基類中的虛函數只要是public的,不管在派生中該函數訪問方式如何,通過動態綁定可以訪問該函數;
b->print (); //OK
d.print ();??? //error
轉載于:https://www.cnblogs.com/waynecheng/archive/2012/04/22/2464528.html
總結
- 上一篇: 网络2网络布线与数制转换
- 下一篇: 我敬你 迪克牛仔