zoukankan      html  css  js  c++  java
  • Ⅳ 继承与派生①

    1. 继承与派生的定义与实现

    1.1 定义

    1.1.1 概念

    ◼ 用已有类定义新类,新类拥有原有类的全部特征

    ▪ 原有类→基类(父类)

    ▪ 新类→派生类

    ◼ 可以多继承(一个派生类有多个基类)和多层派生(多层继承)

    1.1.2 特点

    新类可以继承原有类的属性和行为,并且可以添加新的属性和行为,或更新原有类的成员

    ◼ 优点:代码重用

    1.2形状类的设计与实现

    1.2.1 原思路(在上一篇已经发现了,太麻烦了,,ԾㅂԾ,,)

     ◼ 存在问题

    ①成员数据冗余

    • CPoint2D center;

    • ULONG color;

    ②成员函数冗余   //会重复好几次

    • void Translate(float dx, float dy);

    1.2.2 新思路

    ◼增加形状类(CShape)

    1.2.3 基类的设计

     ■派生矩形类(其他以此类推)

    1.3 派生类的特点

    ◼ 吸收基类成员(把需要重复的操作放到一起)

    ◼ 添加新成员(根据派生类的需要,增加新的数据成员和成员函数,以描述新的属性和行为。)(放在一起了之后得起个新名字吧~)

     1.4 派生类的性质

    ◼ 继承关系是可以传递的:如类A派生出类B,类B又派生出类C,则类B是 类C的直接基类,类A是类B的直接基类,而类A称为类C的间接基类

    ◼ 继承关系不允许循环:在派生过程中,不允许类A派生出类B,类B又 派生出类C,而类C又派生出类A

    2.继承的方式

    2.1 公有继承(public)

     

    2.2 私有继承(private)

     

     

    2.3 保护继承(Protected)

    ◼ 基类的公有成员和保护成员被继承后作为派生类的保护成员

    ◼ 基类的私有成员在派生类中不能被直接访问

    ◼ 如果将派生类作为新的基类继续派生时,基类成员可以沿继承树继续传播

     就只有一个区别。。

    2.4 三种继承方式比较

     

     3. 派生类的构造与析构

    3.1 定义

     3.2 构造与析构的调用顺序

    #include <iostream>
    
    using namespace std;
    
    class memObj      //成员类
    {
        int a;
    public:
        memObj(int x)
        {
            a = x;
            cout << "Constructing member object " << a << endl;
        }
        ~memObj()
        {
            cout << "Destructing member object" << a << endl;
        }
    };
    
    class base   //基类
    {
        memObj obj1;    //成员类定义
    public:
        base():obj1(1)   //成员类的初始化
        {
            cout << "Constructing base
    ";
        }
        ~base()    //析构函数
        {
            cout << "Destructing base
    ";
        }
    };
    
    class derived: public base  //继承
    {
        memObj obj2;   //成员类
    public:
        derived():obj2(2)
        {
            cout << "Constructing derived
    ";
        }
        ~derived()
        {
            cout << "Destructing derived
    ";
        }
    };
    
    int main()
    {
        derived ob;
        return 0;
    }

    ◼ 首先调用基类成员类构造函数

    ◼ 然后调用基类构造函数

    ◼ 再调用派生类成员类的构造函数

    ◼ 最后调用派生类构造函数
    ◼ 当派生类对象析构时,各析构函数的调用顺序正好相反

  • 相关阅读:
    TCP 连接状态
    可视化垃圾回收算法
    flume-ng+Kafka+Storm+HDFS 实时系统搭建
    WeX5 IDE 手机移动开发+JAVA +大数据
    云计算高级运维工程师
    CentOS 5.8 上安装 systemtap-2.6
    SYSTEMTAP -ORACLE
    Apple激活日期查询
    Div 浮动到另一个div之上
    Python模块常用的几种安装方式
  • 原文地址:https://www.cnblogs.com/syzyaa/p/12709420.html
Copyright © 2011-2022 走看看