本人微信公众号"aeolian"~

C++继承(07)

继承

通过特殊化已有的类来建立新类的过程,叫做“类的派生”,原来的类叫做“基类”,新建立的类则叫做“派生类”。另一方面,从类的成员角度看,派生类自动地将基类的所有成员作为自己的成员,这叫做“继承”。基类和派生类又可以分别叫做“父类”和“子类”,有时也称为“一般类”和“特殊类”。

当从现有的类中派生出新类时,派生类可以有以下几种变化:

(1)增加新的成员(数据成员或成员函数)

(2)重新定义已有的成员函数

(3)改变基类成员的访问权限  

C++派生类使用两种基本的面向对象技术:第一种称为性质约束,即对基类的性质加以限制;第二种称为性质扩展,即增加派生类的性质。  

C++中有两种继承:单一继承和多重继承。对于单一继承,派生类只能有一个基类;对于多重继承,派生类可以有多个基类。(这点不同于java)

静态成员可以被继承,这时,基类对象和派生类的对象共享该静态成员。

单一继承

class 派生类名:访问控制 基类名{ 
    private: 成员声明列表 
    protected: 成员声明列表 
    public:  成员声明列表 
}; 

用关键字class声明一个新的类。冒号后面的部分指示这个新类是哪个基类的派生类。所谓“访问控制”是指如何控制基类成员在派生类中的访问属性。它是3个关键字public、private、protected中的一个。一对大括号“{}”是用来声明派生类自己的成员的。

派生类的构造函数和析构函数

派生类名::派生类名(参数表0) : 基类名(参数表) {...//函数体}

冒号后“基类名(参数表)”称为成员初始化列表,参数表给出所调用的基类构造函数所需要的实参。实参的值可以来自“参数表0”,或由表达式给出。  

构造函数(包括析构函数)是不被继承的,所以一个派生类只能调用它的直接基类的构造函数。当定义派生类的一个对象时,首先调用基类的构造函数,对基类成员进行初始化,然后执行派生类的构造函数,如果某个基类仍是一个派生类,则这个过程递归执行。该对象消失时,析构函数的执行顺序和执行构造函数的顺序正好相反。

“isa”和“has-a”的区别

类与类之间的关系有两大类:一是继承和派生问题,二是一个类使用另一个类的问题。后者的简单用途是把另一个类的对象作为自己的数据成员或者成员函数的参数。  对于继承,首先要掌握公有继承的赋值兼容规则,理解公有继承“就是一个(isa)”的含义。  分层也可以叫做包含、嵌入或者聚合。公有继承的意思是“isa”。与此相反,分层的意思是指“has-a(有一个)”。

私有派生

通过私有派生,基类的私有和不可访问成员在派生类中是不可访问的,而公有和保护成员这时就成了派生类的私有成员,派生类的对象不能访问继承的基类成员,必须定义公有的成员函数作为接口。更重要的是,虽然派生类的成员函数可通过定义自定义的函数访问基类的成员,但将派生类作为基类在继续派生时,这时即使使用公有派生,原基类公有成员在新的派生类中也将是不可访问的。

保护派生  

派生也可以使用protected。这种派生使原来的权限都降一级使用,即private变为不可访问;protected变为private;public变为protected。因为限制了数据成员和成员函数的访问权限,所以用的比较少。它与private继承的主要区别在于下一级的派生中。

多重继承

一个类从多个基类派生的一般形式如下:

class 类名1:访问控制 类名2,访问控制 类名3,...,访问控制 类名n {...//定义派生类自己的成员};

 

点赞

Leave a Reply

Your email address will not be published. Required fields are marked *