Ⅳ 继承与派生①

时间:2020-04-16
本文章向大家介绍Ⅳ 继承与派生①,主要包括Ⅳ 继承与派生①使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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\n";
    }
    ~base()    //析构函数
    {
        cout << "Destructing base\n";
    }
};

class derived: public base  //继承
{
    memObj obj2;   //成员类
public:
    derived():obj2(2)
    {
        cout << "Constructing derived\n";
    }
    ~derived()
    {
        cout << "Destructing derived\n";
    }
};

int main()
{
    derived ob;
    return 0;
}

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

◼ 然后调用基类构造函数

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

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

原文地址:https://www.cnblogs.com/syzyaa/p/12709420.html