Part7 继承与派生 7.1继承的基本概念和语法 7.2 继承方式

7.1继承的基本概念和语法

继承:保持已有类的特性而构造新类的过程称为继承
派生:在已有类的基础上新增自己的特性而产生新类的过程称为派生。

继承与派生的目的:
  继承的目的:实现设计与代码的重用。
  派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。

派生类的构成:
  1 吸收基类成员
  2 改造基类成员
  3 添加新的成员

默认情况下派生类包含了全部基类中除了构造和析构函数之外的所有成员。
c++11 规定可以用using语句继承基类构造函数



7.2 继承方式
1 继承方式简介及公有继承
不同继承方式的影响主要体现在:
  派生类成员对基类成员的访问权限
  通过派生类对象对基类成员的访问权限

三种继承方式:
  公有继承
  私有继承
  保护继承

公有继承:
  继承的访问控制:
    基类的public和protected成员:访问属性在派生类中保持不变;
    基类的private成员:不可直接访问。
  访问权限:
    派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员;
    通过派生类的对象:只能访问public成员。

//7-1公有继承举例
//Point.h
#ifndef _POINT_H
#define _POINT_H
class Point{
public:
    void initPoint(float x = 0, float y = 0){
        this->x = x;
        this->y = y;
    }
    void move(float offX, float offY){
        x += offX;
        y += offY;
    }
    float getX() const {return x;}
    float getY() const {return y;}
private:
    float x,y;
};
#endif //_POINT_H

//Rectangle.h
#ifndef _RECTANGLE_H
#define _RECTANGLE_H
#include "Point.h"
class Rectangle:public Point{
public:
    //新增公有函数成员
    void initRectangle(float x, float y, float w, float h){
        initPoint(x,y);//调用基类公有成员函数
        this->w = w;
        this->h = h;
    }
    float getH() const {return h;}
    float getW() const {return w;}
private:
    float w,h;
};
#endif //_RECTANGLE_H

//main.cpp
#include<iostream>
#include<cmath>
#include "Rectangle.h"
using namespace std;
int main(){
    Rectangle rect; //定义Rectangle类的对象
    //设置矩形的数据
    rect.initRectangle(2,3,20,10);
    rect.move(3,2);
    cout << "The data of rect(x,y,w,h):" << endl;
    cout << rect.getX() << ", "
         << rect.getY() << ", "
         << rect.getW() << ", "
         << rect.getH() << endl;
    return 0;
}

2 私有继承和保护继承
私有继承(private):
  继承的访问控制
    基类的public和protected成员:都以private身份出现在派生类中;
    基类的private成员:不可直接访问。
  访问权限
    派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员;
    通过派生类的对象:不能直接访问从基类继承的任何成员。

//Point.h
#ifndef _POINT_H
#define _POINT_H
class Point{
public:
    void initPoint(float x = 0, float y = 0){
        this->x = x;
        this->y = y;
    }
    void move(float offX, float offY){
        x += offX;
        y += offY;
    }
    float getX() const {return x;}
    float getY() const {return y;}
private:
    float x,y;
};
#endif //_POINT_H

//Rectangle.h
#ifndef _RECTANGLE_H
#define _RECTANGLE_H
#include "Point.h"
class Rectangle: private Point{
public:        //新增公有函数成员
    void initRectangle(float x, float y, float w, float h){
        initPoint(x,y);        //调用基类公有成员函数
        this-> w = w;
        this-> h = h;
    }
    void move(float offX, float offY){
        Point::move(offX, offY);
    }
    float getX() const {return Point::getX();}
    float getY() const {return Point::getY();}
    float getH() const {return h;}
    float getW() const {return w;}
private:
    float w,h;
};
#endif //_RECTANGLE_H

//main.cpp
#include<iostream>
#include<cmath>
#include "Rectangle.h"
using namespace std;
int main(){
    Rectangle rect;
    rect.initRectangle(2,3,20,10);
    rect.move(3,2);
    cout << "The data of rect(x,y,w,h): " << endl;
    cout << rect.getX() << ", "
         << rect.getY() << ", "
         << rect.getW() << ", "
         << rect.getH() << endl;
    return 0;
}

保护继承(protected)
  继承的访问控制
    基类的public和protected成员:都以protected身份出现在派生类中;
    基类的private成员:不可直接访问。
  访问权限
    派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员;
    通过派生类的对象:不能直接访问从基类继承的任何成员。

时间: 2024-10-11 21:07:19

Part7 继承与派生 7.1继承的基本概念和语法 7.2 继承方式的相关文章

继承和派生(1)—— 类与类之间的关系、继承的基本概念

1.类与类之间的关系 has-A,uses-A 和 is-A has-A 包含关系,用以描述一个类由多个"部件类"构成.实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类. uses-A 一个类部分地使用另一个类.通过类之间成员函数的相互联系,定义友员或对象参数传递实现. is-A 机制称为"继承".关系具有传递性,不具有对称性. class A { public: void funcA() { } int a; }; //类B拥有类A的成员变

C++继承与派生

2017-06-25 23:00:59 c++中的继承和派生是面向对象编程中的一个重要内容,通过继承可以实现代码的复用,同时继承也是实现多态性的基础. 一.c++继承的基本形式 class 派生类名:继承方式 基类名,继承方式 基类名 {}: 继承方式主要有三种,public ,private ,protected. 缺省条件下是private继承,三种中public继承用的最多,不同的继承方式决定了子类中从基类继承过来的成员的访问属性. public继承: 基类的public,protecte

类的继承与派生

继承与派生 在教材中给出的对类的继承和派生的解释: "类的继承,是新的类从已有类那里得到已有的特性." "从已有的类产生新类的过程就是类的派生." 新的类是基类的派生类,新的类从基类处得到已有的特性. 一.继承与派生举例 新的类是基类的派生类,新的类从基类处得到已有的特性. 例1.写一个类student,再写一个Student类的派生类Undergraduate. 代码: #define _CRT_SECURE_NOWARNINGS #include<iost

多继承(虚继承)派生类对象内存结构

在这里谈一下虚继承.前面写过派生类对象的内存结构,都是基于VS2010编译器的,不同的编译器对于继承的处理不同,但本质都是一样的. 虚继承是解决共享基类问题的.例如在菱形继承中 如果不使用虚继承,基类A在D中会有两个,这不仅浪费内存,还会造成歧义.使用虚继承就可以解决基类共享的问题. 要想在派生类中共享基类(例如在D对象中只有一个A对象,这时候D对象中的B对象和C对象都可以查找到A,而不是在B对象和C对象中各含有一个A对象). 先看下面一个例子: #include<iostream> usin

程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1

描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8. ijAl- 9. ijAl-mnop 10. qrst-abcd- 11. abcd-qrst-abcd- uvw xyz about big me take abcd qrst-abcd- 要 求:MyString类必须是从C++的标准类string类派生而来.提示1:如果将程序中所有 "My

四.OC基础--1.文档安装和方法重载,2.self和super&amp;static,3.继承和派生,4.实例变量修饰符 ,5.私有变量&amp;私有方法,6.description方法

四.OC基础--1.文档安装和方法重载, 1. 在线安装 xcode-> 系统偏好设置->DownLoads->Doucument->下载 2. 离线安装 百度xcode文档 3. 方法重载: 是指在一个类中定义多个同名的方法 在OC中没有重载 2.self和super&static, self和super: 1. self理解: 谁调用当前方法, self就代表谁. 比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法 在类方法中, self代表的

模块的封装之C语言类的继承和派生

[交流][微知识]模块的封装(二):C语言的继承和派生 在模块的封装(一):C语言的封装中,我们介绍了如何使用C语言的结构体来实现一个类的封装,并通过掩码结构体的方式实 现了类成员的保护.这一部分,我们将 在此的基础上介绍C语言类的继承和派生.其实继承和派生是一个动作的两种不同角度的表达 .当我们继承了一个基类而创造了一个新类时,派生的概念就诞生了.派生当然是从基类派生的.派生出来的类当然是继承了基类的 东西.继承和派生不是一对好基友,他们根本就是一个动作的两种不同的说法,强调动作的起始点的时候

python面向对象之继承与派生

一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的话,继承顺序有深度和广度2种 示例: class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass

3.继承与派生

1.类的继承与派生 - 类的继承:从已有类产生新类的过程.原有类称为基类或父类,产生的新类称为派生类或子类. - 派生类语法: class 派生类名:继承方式   基类名1,继承方式 基类名2,... { } - 单继承和多继承:基类个数决定 - 直接基类,间接基类 - 继承方式规定了如何访问从基类继承的成员 - 派生类成员是指除了从基类继承的所有成员之外,新增加的数据和函数成员 - 派生类生成过程:吸收基类成员->改造基类成员->添加新的成员,构造函数和析构函数都不被继承 2.访问控制 -