面向对象与C++程序设计-类的继承与派生学习笔记

基类与派生类

继承

继承就是从先辈处得到属性和行为特征。

类的继承就是新的类从已有类那里得到已有的特性。

在C++中,继承就是在一个已存在的类的基础上建立一个新的类。
已存在的类称为基类(base class),又称为父类;新建立的类称
为派生类(derived class),又称为子类。

派生类

从已有的父类产生一个新的子类,称为类的派生。派生
类继承了基类的所有数据成员和成员函数,具有基类的特性,派生
类还可以对成员作必要的增加或调整,定义自己的新特性。

单级派生

一个派生类可以只从一个基类派生,称为单一继承(single
inheritance),这是最常见的继承形式,如图所示,类B和类C都只
从类A派生。

graph LR
B-->A
C-->A
多级派生

一个派生类有两个及两个以上的基类,称为多重继承(multiple
inheritance),如图所示,类C从类A和类B派生。

graph LR
C-->A
C-->B
基类与派生类之间的关系为:
基类是对派生类的抽象,派生类是对基类的具体化。

派生类的声明

声明一个派生类的一般格式为:
class 派生类名:[继承方式] 基类名{
    派生类新增的数据成员和成员函数
}

基类名: 一个已经声明的类的名称

派生类名: 继承原有类的特性而生成的新类的名称

继承方式: 规定如何访问从基类继承的成员。

可以是public(公有继承)、protected(保护继承)或private(私有继承)
如果未给出访问标号则默认为private(私有继承)

从已有类派生出新类时,可以在派生类内完成以下几种功能

(1)可以增加新的数据成员;
(2)可以增加新的成员函数;
(3)可以对基类的成员进行重定义;
(4)可以改变基类成员在派生类中的访问属性

积累成员在派生类成员中的属性

(1)基类中的私有成员
无论哪种继承方式,积累中的私有成员都不允许派生类继承,即在派生类中是不可访问的。
(2)基类中的公有成员
公有继承时,基类中的公有成员在派生类中仍以公有成员的身份出现。
私有继承时,基类中的公有成员在派生类中都是以私有成员的身份出现的。
保护继承时,基类中的公有成员在派生类中都是以保护成员的身份出现的。
(3)基类中的保护成员
公有继承时,基类中的保护成员在派生类中仍以保护成员的身份出现。
私有继承时,基类中的保护成员在派生类中都是以私有成员的身份出现的。
保护继承时,基类中的保护成员在派生类中仍以保护成员的身份出现。

派生类举例:

#include <iostream>
using namespace std;
class Base //基类
{
    private:
        int b_number;
        public:
               Base(){} //基类不带参数的构造函数
               Base(int i) : b_number(i) { } //基类带参数的构造函数
               int get_number() { return b_number; }
               void print() { cout << b_number << endl; }
 };

class Derived : public Base //派生类
{
    private:
         int d_number; //派生类增加的数据成员 
    public:
        Derived(int i, int j) :Base(i), d_number(j){};
            //派生类构造函数
        void print()//派生类增加的成员函数
       {
            cout << get_number() << " "; //派生类继承的成员函数
            cout << d_number << endl;
        }
};

int main()
{
    Base a(2);
    Derived b(3, 4);
    cout << "a is ";
    a.print();                //基类的print
    cout << "b is ";
    b.print();                //派生类的print
    system("pause");
}

PTA的例题

1.求平面几何形状的面积(圆形和矩形)C++

下列shape类是一个表示形状的基类,该类有一个计算形状面积的方法area( )。请以形状类”Shape”为基类派生出圆形类”Circle”和矩形类”Rectangle”,要求保持求面积的接口不变。从键盘输入圆形的半径和矩形的长和宽,在主函数中创建一个圆形类”Circle”的对象和一个矩形类”Rectangle”的对象,计算并输出这个圆形和矩形的面积。圆周率PI=3.14

class shape{

public:

double area( ){ }

};

圆形类名:Circle
注意:圆周率PI=3.14
矩形类名:Rectangle

裁判测试程序样例:

#include <iostream>
using namespace std;
class Shape{
public:
    double area ( ){ return -1; }
};
//你提交的代码将嵌入到这里。 

int main()
{
    double r,h,w;
    cin>>r>>h>>w;
    Circle c(r); Rectangle rect(h,w);

    cout<<"The area of the Circle is "<<c.area( )<<endl;
    cout<<"The area of the Rectangle is "<<rect.area( )<<endl;

    return 0;
}

输入样例:

8.8
16.8  9.8

输出样例:

The area of the Circle is 243.162
The area of the Rectangle is 164.64

提交代码:

class Circle : public Shape{
private:
    double R;
public:
    Circle(double r) :R(r) { };
    double area(){ return R*R*3.14; }
};
class Rectangle : public Shape{
private:
    double H, W;
public:
    Rectangle(double h, double w) :H(h), W(w) { };
    double area(){ return H*W; }
};

2.从shape类派生出一个圆形类Circle

请从下列shape类派生出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造函数。圆周率PI取3.1415926。

class shape {

public:

double getArea(){ };

double getPerimeter(){ };

}

圆形类名Circle

裁判测试程序样例:

#include <iostream>
using namespace std;

class shape {
public:
  double getArea(){ };// 求面积
  double getPerimeter(){ }; // 求周长
};

/* 你提交的代码将被嵌入到这里 */


int main() {
  double r;
  cin>>r;
  Circle c(r);
  cout<<c.getArea()<<endl;
  cout<<c.getPerimeter()<<endl;
  return 0;
}

输入样例:

2.78

输出样例:

24.2795
17.4673

目标代码:

double const PI = 3.1415926;
class Circle :public shape{
private:
    double radius;
public:
    Circle(double r) :radius(r){ };
    double  getArea(){ return radius*radius*PI; }
    double getPerimeter(){ return 2 * PI*radius; }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值