C++学习笔记45——继承方式

来源:互联网 发布:云梦网络建站怎么样 编辑:程序博客网 时间:2024/04/30 23:26

1,继承方式概述

派生列表中使用的访问标号将继承方式分为3中:public继承、protected继承和private继承。
派生类中继承而来的成员的访问级别由基类中该成员的访问级别和派生列表中的访问标号两者共同决定。通用的原则是:取两者中更严格的那个。
细分如下:
  • public继承:      继承而来的成员保持原先的访问级别不变,基类的public成员成为派生类的public成员,基类的protected成员成为派生类的protected成员;
  • protected继承:基类的的public、protected成员都成为派生类的protected成员;
  • private继承:     基类的的public、protected成员都成为派生类的private成员;
为什么不提基类的private成员?因为private成员是不可继承的,在派生类中不可见的。

只要不是基类中的private成员,其他成员在派生类中都是可见的,在派生类的成员函数定义体中都是可以直接使用的,这一点与继承方式无关。
继承方式(派生列表中的访问标号)影响的是派生类的用户对继承而来的成员的访问权限。

2,接口继承与实现继承

public继承让派生类获得了基类的所有接口——public成员函数,而protected继承让基类中的成员函数成为protected或private成员,只能在其他成员函数的定义体中使用,而不能被类的使用者使用,这就是实现继承。
设计良好的类层次中,public派生类对象可以用在任何需要基类对象的地方

3,去除个别成员:using

派生类可以恢复继承成员的访问级别,但仅仅是恢复,不能使访问级别比基类中原来指定的更严格或宽松。使用的方法就是“using”关键字。
举例如下:
class Base{public:void test() { cout << "Base\n" << endl; };private:int n;};class Drived :private Base{public:void new_test() { cout << "New"; test(); };//using Base::test();//error!//using Base::n; // error C2877: “Base::n”无法从“Base”访问using Base::test;};

如同例子中展示的那样,这种用法对private成员无能为力,不能用这种办法让派生类继承到基类的private成员。
由于test成员在Base中已经定义了,在Drived中只用它的名字即可,不能再加括号,否则会被认为是在调用函数。
在上面的例子中,由于是private继承,所以test在Drived中原本是private成员;使用using声明后,test就变成了public成员了,能够被类的用户使用了。

4,默认继承机制

使用class定义的派生类,默认使用private继承;
使用struct定义的派生类,默认使用public继承。

使用class还是struct定义类只有两个地方不同:
  1. 默认的成员访问级别
  2. 默认的派生保护级别
class都是默认private,struct都是默认public。
然而,事实上绝大多数继承都是public继承,而不是class默认的private继承。

0 0
原创粉丝点击