class Bulk_item:public Item_base{...};
那么基类中的public与protected就像派生类中的public和protected类型一样。
2)如果派生类是受保护继承(protected inheritance)
class Bulk_item:protected Item_base{...};
基类中的public和protected成员 就像派生类的中protected一样
3)如果派生类是私有继承(private inheritance)
class Bulk_item:private Item_base{...};
基类中的public和protected成员 就像派生类的中private一样,用户不能通过派生类对象访问基类中的任何成员。
public派生类继承了基类的接口,可以在需要基类的地方使用public派生类。而private和protected派生类则不可以。
可以用using 声明恢复基类成员在派生类中的访问级别。
class和struct在定义继承类的,默认的继承类别也不同。
class Base{...};
class D1:Base{...} 等价于 class D1:private Base{...}
struct D2:Base{...} 等价于 class D2:public Base{...}
class 与 struct 用来定义类除了访问级别的不同外,其他没有任何不同。
派生类的成员函数中不能直接访问基类类型对象的protected成员,但是可以通过派生类对象访问基类的protected成员。
void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b) { // price is protected double ret = price; //ok ret = d.price;//ok ret = b.price;//error }
2.5 继承与静态成员
如果基类定义了static成员,则在整个继承层次中只有一个这样的成员。
2.6 防止继承的发生
有时候我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类。C++11中允许在类名后加一个关键字final来防止继承。
Class NoDerived final{/* */ } Class Bad : public NoDerived{/* */ } // error!
3 派生类与基类之间的转换
可以将基类的指针或引用绑定到派生类对象上有一层极为重要的含义:当使用基类的引用(或指针)时,实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。该对象可能是基类的对象,也可能是派生类的对象。
3.1 静态类型与动态类型
表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型;动态类型则是变量或表达式表示的内存中的对象的类型,动态类型直到运行才可知。如果表达式既不是引用也不是指针,则它的动态类型永远与静态类型一致。
3.2 派生类转换为基类
引用转换不同于对象转换
1)将派生类对象传递给希望接受基类引用的函数,实际上传递进去的就是原来的派生类对象,这个对象没有发生任何变化。