定义派生类时一定要见到基类的定义 class A;/声明 class B:public A //Error int z; public: void h(){g(O;}/Error,编译程序不知道基类中 /是否有函数g以及函数g的原型。 Bb;/Error,编译无法确定b所需内存空间的大小。 如果在派生类中没有显式说明,基类的友元不是 派生类的友元;如果基类是另一个类的友元,而 该类没有显式说明,则派生类也不是该类的友元
◼ 定义派生类时一定要见到基类的定义。 class A; //声明 class B: public A //Error { int z; public: void h() { g(); } //Error,编译程序不知道基类中 //是否有函数g以及函数g的原型。 }; ...... B b; //Error,编译无法确定b所需内存空间的大小。 ◼ 如果在派生类中没有显式说明,基类的友元不是 派生类的友元;如果基类是另一个类的友元,而 该类没有显式说明,则派生类也不是该类的友元
在派生类中访问基类成员 ■C++中,派生类不能直接访问基类的私有成员。 class A int x,y; public: void void b…x,y… class B:public A int Z; public: void h() ...X,y... /Error,X、y为基类的私有成员。 f();//OK g(O;/OK,通过函数g访问基类的私有成员×和y
◼ C++中,派生类不能直接访问基类的私有成员。 class A { int x,y; public: void f(); void g() { ... x ,y ... } }; class B: public A { int z; public: void h() { ... x,y ... //Error,x、y为基类的私有成员。 f(); //OK g(); //OK,通过函数g访问基类的私有成员x和y。 } }; 在派生类中访问基类成员
继承与封装的矛盾 在派生类中定义新的成员函数或对基类已有成 员函数重定义时,往往需要直接访问基类的 些private成员(特别是private数据成员) 否则新的功能无法实现 类的private成员是不允许外界使用的(数据 封装)! 这样就带来了继承与封装的矛盾
继承与封装的矛盾 ◼ 在派生类中定义新的成员函数或对基类已有成 员函数重定义时,往往需要直接访问基类的一 些private成员(特别是private数据成员), 否则新的功能无法实现。 ◼ 类的private成员是不允许外界使用的(数据 封装)! ◼ 这样就带来了继承与封装的矛盾
实际上,有了继承机制以后,一个类的成 员有两种被外界使用的场合: 。通过类的对象(实例)使用 在派生类中使用 class A { m class B:public A f(){.m..}/通过派生类使用A的成员m }: void g() Aa; .a.m..//通过A的对象(实例)使用A的成员m
◼ 实际上,有了继承机制以后,一个类的成 员有两种被外界使用的场合: • 通过类的对象(实例)使用 • 在派生类中使用 class A { ...... m }; class B: public A { ...... f() { ... m ...} //通过派生类使用A的成员m }; void g() { A a; ... a.m ... //通过A的对象(实例)使用A的成员m }
访问控制:protected 在C++中, 除了public和orivate,还提供 了另外一种类成员访问控制:protected 用protected说明的成员不能通过对象使用, 但可以在派生类中使用 protected访问控制缓解了封装与继承的矛盾 C++类向外界提供两种接口: public:对象的使用者(类的实例用户) public-+protected:派生类
访问控制:protected ◼ 在C++中,除了public和private,还提供 了另外一种类成员访问控制:protected, • 用protected说明的成员不能通过对象使用, 但可以在派生类中使用。 • protected访问控制缓解了封装与继承的矛盾 ◼ C++类向外界提供两种接口: • public:对象的使用者(类的实例用户) • public+protected:派生类