Wayne的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2012-04-22 00:28  Wayne Cheng  阅读(381)  评论(0编辑  收藏  举报