1、派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。
派生类对于一个基类中的受保护成员没有任何访问特权。
2、派生访问说明符的目的是控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限。
Pub_Derv d1; //继承自Base的成员是public的 Pric_Derv d2; //继承自Base的成员是private的 d1.pub_mem(); //正确:pub_mem在派生类中是public的 d2.pub_mem(); //错误,pub_mem在派生类中是private的
3、只有当派生类公有地继承基类时,用户代码才能使用派生类向基类的转换。如果继承方式是私有或保护的,则用户代码不能使用该转换。
不论派生类以什么方式继承基类,派生类的成员函数和友元都能使用派生类向基类的转换。
如果继承方式是公有的或者受保护的,则派生类的派生类可以使用派生类向基类的类型转换,私有则不行。
4、友元关系不能传递也不能继承。
5、可以用using声明改变个别成员的可访问性。
class Base{ public: size_t size() const {return n;} protected: size_t n; }; class Derived : private Base{ public: using Base::size; protected: using Base::n; }
6、派生类的作用域嵌套在基类的作用域之内,如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。
7、一个对象,引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型可能不一致。
//Disc_quote 定义了discount_policy(),Bulk_quote继承Disc_quote Bulk_quote bulk; Bulk_quote* bulkP = &Bulk; //静态类型与动态类型一致 Quote* itemP = &bulk; //静态类型与动态类型不一致 bulkP->discount_policy(); //正确:bulkP的类型是Bulk_quote itemp->discount_policy(); //错误:itemP的类型是Quote