首页   

继承和派生

医学农民工  ·  · 4 年前

我们知道C++里面有很多机制是为了提高软件的重用性来设计的, 什么叫重用性好呢?就是你有一部分代码实现了一个功能, 后面你要新写一个代码,从那里要实现一个功能的时候,你不必重头写,你把原来的代码直接拿来用就可以了,这就叫做可重用性好。

1.派生

继承和派生这两程序是一回事,我们可以把类A做成一个 基类 ,把类B作为基类A的一个 派生类(也称为子类) 来写。 A和B重的部分,我们就不需要重头去写了。

派生类的写法:class派生类名:public 基类名 {};

class派生类名:public 基类名 
{
};

派生类对象的内存空间(对象的体积)等于基类对象的体积加上派生类对象自己的成员变量的体积,而且,派生类对象中所包含的基类对象,它的存储位置是位于派生类对象的新增成员对象的 前面

派生类,它拥有基类的 全部特点 (它拥有基类的 全部成员 函数和成员变量)。 此外还可以对基类进行 修改 扩充
扩充 比较简单一点,就是我们可以为这个派生类添加新的成员变量 和成员函数。
所谓 修改 ,指的就是在派生类里面,我们可以写和 基类名称相同的成员函数 ,但这成员函数的行为跟基类不太一样,这可以称作一种修改( 覆盖 )。

派生类一经定义以后,就可以独立使用。可以用它定义对象,定义对象的时候不需要再扯进基类。尽管派生类继承了基类private的成员,但是在派生类的成员函数中,依然 不能够访问 这些继承自基类的private成员。

在声明派生类时,只需要列出它的直接基类
●派生类沿着类的层次自动向上继承它的间接基类
●派生类的成员包括:
⑴派生类自己定义的成员
⑵直接基类中的所有成员
⑶所有间接基类的全部成员

2.复合关系和继承关系

类和类之间主要有三种关系: 没关系 继承关系 复合关系
继承关系: “是” 关系
-基类A,B是基类A的派生类
-逻辑上要求:一个B对象也是一个A对象(就好比我们从学生类派生出中学生类)

复合关系: “有 ” 关系
-类C中“有”成员变量K,K是类D的对象,则C和D是复合关系
-一般逻辑上要求:D对象是C对象的固有属性和组成部分(
几何形体程序中,需要写“点”类,也需要写“圆”类,两者的关系就是复合关系——每一个“圆”对象里都包含有一个“点”对象,这个“点”对象就是圆心。)

3.基类/派生类同名成员和protected访问范围说明符

基类和派生类有时候会出现同名成员的情况,也就是拥有相同名称的成员变量或者成员函数。
如果我们有一个基类class base, 在这个基类里面定义了一个成员变量int j,此外还有int i和void func()。 由这个基类派生出来的一个新的类class derived,class derived里头也包含了一个int i 还有一个函数void access()和void func()。
一般来说,基类和派生类不定义同名成员变量。
例:

class base{    //基类
        int j;        //私有成员
    public:
        int i;
        viod func();
}

class derived : public base {    //派生类
    public:
        int i;
        viod access();
        viod func();
}

void derived::access()
{
j=5;   // error ,j是基类私有成员,派生类无法访问
i=5;  //引用的是派生类 i
base::i=5;   //加入::定位符 ,引用的是基类 i
func();  //引用的是派生类 
base::func();  //引用的是基类
}

derived obj;
obj.i=1;
obj.base::i=1;

访问范围说明符
1、 基类的private成员:可以被下列函数访问
●基类的成员函数
●基类的友员函数
2、 基类的public成员:可以被下列函数访问
●基类的成员函数
●基类的友员函数
●派生类的成员函数
●派生类的友员函数
●其他的函数
3、 基类的protected成员:可以被下列函数访问
●基类的成员函数
●基类的友员函数
●派生类的成员函数可以访问当前对象的基类的保护成员

4.派生类的构造函数

派生类和其他所有的类一样都包含一个构造函数,当派生类去调用构造函数的时候, 首先就需要去执行基类的构造函数 ,去初始化那些派生类中间包含的基类对象的一些初始化。
具体形式:构造函数名(形参表):基类名(基类构造函数实参表)
调用基类构造函数的两种方式
•显式方式:
派生类的构造函数中→基类的构造函数提供参数


derived::derived(arg_derived-list):base(arg_base-list)
//在派生类derived类里,去定义相应的形参参数,具体的实参写在基类base的构造函数实参列表里

•隐式方式:
派生类的构造函数中,省略基类构造函数时,派生类的构造函数自动调用基类的默认构造函数。

派生类的析构函数被执行时,执行完派生类的析构函数后,自动调用基类的析构函数。

•创建派生类对象时,执行派生类的构造函数之前:
①调用基类的构造函数
→初始化派生类对象中从基类继承的成员
②调用成员对象类的构造函数
→初始化派生类对象中成员对象
•执行完派生类的析构函数后:
①调用成员对象类的析构函数
②调用基类的析构函数

5.public继承的赋值兼容规则

⑴派生类的对象可以赋值给基类对象(一个基类对象并不是一个派生类对象)
⑵派生类对象可以初始化基类的引用
⑶派生类对象的地址可以赋值给基类的指针

推荐文章
上辈子是hr  ·  年薪100万的金融人,基本都有同一种特质  ·  2 年前  
葡萄不酸呀  ·  2020-07-21  ·  3 年前  
英为财情Investing  ·  国外花式抗疫集锦:舔墙、喝尿、囤枪...  ·  4 年前  
底线思维  ·  执政百日,特朗普外交打几分?  ·  7 年前  
© 2022 51好读
删除内容请联系邮箱 2879853325@qq.com