基类与派生类
继承
继承就是从先辈处得到属性和行为特征。
类的继承就是新的类从已有类那里得到已有的特性。
在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; }
};