1, public 本身,派生类,友元,普通类,都可以随意访问。
2,private 类本身,友元,可以访问。
3,protected 类本身,派生类(派生类只能通过派生类对象访问其基类的protected成员, 派生类不可以对其基类类型对象的protected成员没有特殊的访问权限)
eg:基类:Item_base, 派生类:Bulk_item;
Bulk_item的一个成员函数,该函数可以访问自己对象的protected成员,以及Bulk_item形参的protected成员,但是,它不能访问Item_base形参的protected成员。
void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
{
double ret = price;
ret = d.price(); // ok
ret = b.price(); // error: no access to price from an Item_base
}
4,派生类与虚函数
1》没有规定派生类必须重定义所继承的虚函数,但是一般会这么做。如果派生类没有重定义某个虚函数,则使用基类中定义的版本。
2》一旦函数在基类中声明为虚函数, 他就一直未虚函数,派生类无法改变该函数为虚函数这一事实。派生类重定义虚函数时,可以使用virtual保留字,但不是必须这样做。
5,virtual 与其他成员函数
c++中的函数调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不进行动态绑定; 第二,必须通过基类类型的引用或指针进行函数调用。
基类类型引用和指正的关键点紫玉静态类型(在编译时克制的引用类型或指针类型) 和动态类型(指针或引用所绑定的对象的类型, 这就是尽在运行时可知的) 可能不同。
6,覆盖虚函数机制,
在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,这时可以使用作用域操作符::
eg:Item_base *baseP = &derived;
double d = baseP->Item_base::net_price(42);
这段代码强制将net_price 调用确定为Item_base中定义的版本,该调用将在编译时确定。
派生类虚函数调用基类版本时,必须显示使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,陷入无穷递归。
虚函数 与 默认实参
1,通过基类的引用或指针调用虚函数时,默认实参为在基类虚函数申明中指定的值,如果通过派生类的指针或引用调用虚函数,则默认实参时在派生类的版本中申明的值。
2,在同意虚函数的基类版本和派生类版本中使用不同的默认实参几乎一定会引起麻烦。如果通过基类的引用或指针调用虚函数,但实际执行的是派生类中定义的版本,这时就可呢过出现问题。