实现一个图形类(Shape),包含受保护成员属性:周长、面积,
公共成员函数:特殊成员函数书写
定义一个圆形类(Circle),继承自图形类,包含私有属性:半径
公共成员函数:特殊成员函数、以及获取周长、获取面积函数
定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度
公共成员函数:特殊成员函数、以及获取周长、获取面积函数
在主函数中,分别实例化圆形类对象以及矩形类对象,并测试相关的成员函数。
#include <iostream>
#define PI 3.14
using namespace std;
//实现一个图形类(Shape),包含受保护成员属性:周长、面积,
//公共成员函数:特殊成员函数书写
class Shape
{
public:
Shape():perimeter(0),area(0)
{
}
Shape(double p,double a):perimeter(p),area(a)
{
}
Shape(const Shape &shape)
{
this->perimeter = shape.perimeter;
this->area = shape.area;
}
~Shape(){}
Shape& operator=(const Shape &shape)
{
this->perimeter = shape.perimeter;
this->area = shape.area;
return *this;
}
protected:
double perimeter;
double area;
};
//定义一个圆形类(Circle),继承自图形类,包含私有属性:半径
//公共成员函数:特殊成员函数、以及获取周长、获取面积函数
class Circle:public Shape
{
public:
Circle(double r):r(r)
{
perimeter = 2 * PI *r;
area = r*r*PI;
}
Circle(Circle *c):Shape(c->perimeter,c->area),r(c->r)
{
}
~Circle(){}
Circle& operator=(const Circle &c)
{
this->r = c.r;
this->perimeter = c.perimeter;
this->area = c.area;
return *this;
}
double get_perimeter()
{
return perimeter;
}
double get_area()
{
return area;
}
private:
double r;
};
//定义一个矩形类(Rect),继承自图形类,包含私有属性:长度、宽度
//公共成员函数:特殊成员函数、以及获取周长、获取面积函数
class Rect:public Shape
{
public:
Rect(double l,double w):l(l),w(w)
{
perimeter = 2 *(l+w);
area = l*w;
}
Rect(Rect *c):Shape(c->perimeter,c->area),l(c->l),w(c->w)
{
}
~Rect(){}
Rect& operator=(const Rect &c)
{
this->l = c.l;
this->w = c.w;
this->perimeter = c.perimeter;
this->area = c.area;
return *this;
}
double get_perimeter()
{
return perimeter;
}
double get_area()
{
return area;
}
private:
double l;
double w;
};
int main()
{
//在主函数中,分别实例化圆形类对象以及矩形类对象,
//并测试相关的成员函数。
Circle c1(5);
cout<<"c1的周长:"<<c1.get_perimeter()<<endl;
cout<<"c1的面积:"<<c1.get_area()<<endl;
cout<<"圆类c2由c1赋值构造:"<<endl;
Circle c2(c1);
cout<<"c2的周长:"<<c2.get_perimeter()<<endl;
cout<<"c2的面积:"<<c2.get_area()<<endl;
cout<<"矩形类c3由c1赋值赋值:"<<endl;
Circle c3(2);
c3=c1;
cout<<"c3的周长:"<<c3.get_perimeter()<<endl;
cout<<"c3的面积:"<<c3.get_area()<<endl;
Rect r1(2,5);
cout<<"r1的周长:"<<r1.get_perimeter()<<endl;
cout<<"r1的面积:"<<r1.get_area()<<endl;
cout<<"矩形类c2由c1赋值构造:"<<endl;
Rect r2(r1);
cout<<"r2的周长:"<<r2.get_perimeter()<<endl;
cout<<"r2的面积:"<<r2.get_area()<<endl;
cout<<"矩形类c3由c1赋值赋值:"<<endl;
Rect r3(1,2);
r3=r1;
cout<<"r3的周长:"<<r3.get_perimeter()<<endl;
cout<<"r3的面积:"<<r3.get_area()<<endl;
return 0;
}
笔记:
4.6 继承
4.6.1 继承的基本语法
普通实现:
class 子类(派生类) :继承方式 父类(基类){}
4.6.2 继承方式
继承方式一共三种:
-
公共继承:基类中的公共权限在派生类中也是公共权限,保护权限还是保护权限,私有权限访问不了
-
保护继承:基类中的公共和保护权限,都成为保护权限,私有权限访问不了
-
私有继承:基类中的公共和保护权限都成为私有权限,私有权限访问不了
4.6.3 继承中的对象模型
问题:从父类继承过来的,那些属于子类对象
父类中所有的非静态的成员属性都会被子类继承下去
基类中的非静态私有成员也会被继承下来,只是访问不到
4.6.4 继承中构造和析构顺序
子类继承父类之后,当创建子类对象,也会调用父类的构造函数
顺序:
构造:先父类构造,再构造子类
析构:先子类析构,再父类析构
4.6.5 继承同名成员处理方式
父类和子类中出现同名成员时应该如何访问
-
访问子类通同名成员 直接访问即可
-
访问父类同名成 需要加父类的作用域
如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中多有同名成员函数(包括重载的)
4.6.6 继承同名静态成员处理方式
静态成员和非静态成员出现同名,处理方式一直
4.6.7 多继承语法
c++允许一个类继承多个类
语法:class 子类 : 继承方式 父类1, 继承方式 父类2......
多继承肯会引发父类中有同名成员出现,需要加作用域区分
C++实际开发中不建议用多继承
4.6.8 菱形继承
概念:
两个派生类继承同一个基类
又有某个类同时继承这两个派生类
这种继承被称为菱形继承,或者钻石继承
产生的问题:
都继承了基类,有二义性
继承了两份基类
虚继承
继承之前加上关键字virtual变为虚继承
虚继承中的基类称为,虚基类