chapter 15 面向对象编程OOP

类的访问标号:
private:类的成员函数或友元函数可以访问,派生类或普通函数不能访问;
public:均可以访问;
protected:成员、友元、派生类成员(非友元)均可以访问,其他函数不能访问。 
注:
1 派生类只能通过派生类对象访问其基类的protected成员,而对其基类类型对象的protected成员没有特殊访问权限。 
2 用作基类的类必须使已定义的,只声明不定义不可以作为基类。 
3 如果要声明一个派生类而不实现,则声明不包含派生列表:
    class derived::public base;  //错误
    正确的前向声明为:
    class derived;
    class base; 
4  通过基类的引用或指针调用虚函数时,发生动态绑定(必须有虚函数且使用引用或指针调用才能实现),引用或指针既可以指向基类对象也可以指向派生类对象,实际调用哪个对象的虚函数在运行时确定,被调用的函数是引用或指针所指向对象的实际类型所定义的。例如:
假如base和derived都定义了price函数(为虚函数),则
void print_(ositream& os,const base& item)
{
    os<<item.price()<endl;

item是基类对象的引用,传递给它的实参既可以是基类也可以是派生类对象,如果实参是基类(or 派生类),则运行时调用基类(or 派生类)定义的price函数。 
覆盖虚函数机制:一个例子:基类中的display函数可以显示所有的公共信息,而派生类中的display既要显式公共信息又要显式自己独特的信息,这时派生类display函数可以显式调用基类中的display函数而不需要重复编码,这就是派生类虚函数调用基类版本;此时必须显式使用作用域操作符来制定调用的是基类中的版本,否则会出现自身调用而导致无穷递归。
 eg: base *bp=&derived;
       bp->base::display(); //显式使用作用域操作符 
6 虚函数与默认实参:如果通过基类(or 派生类)的引用或指针调用虚函数,则使用的默认实参为在基类(or 派生类)虚函数声明中指定的值;如果同一虚函数在基类和派生类中的默认实参不同会引起麻烦,例如通过基类的引用或指针调用派生类版本的虚函数,基类定义的默认实参会传递给派生类版本,这样会出现调用错误。
7 在进行protected或private继承时,派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或更宽松;例:
class A
{
public:
  size_t size() const {return n;}
protected:
  size_t n;
};
class B:private A
{
.......
};
若想恢复A类成员的访问级别,可以使用using声明:
class B: private A
{
public:
  using A::size;
protected:
  using A::n;
};
注意:最多只能恢复其访问级别,而不能改变地更高或更低。
8 默认继承保护级别:使用class保留字定义的派生类默认具有private继承,而struct默认具有public继承。
class A
{};
class B:A
{};   //默认private继承
struct B:A
{};   //默认public继承
9 友元关系不能继承!!!!!
10 若基类定义了static成员,则整个继承层次中只有一个这样的成员,其访问级别遵循常规访问控制,若可以访问成员,则既可以通过基类访问static成员,也可以通过派生类访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值