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