C++ --- Day04 继承

本文介绍了如何在C++中实现一个基础图形类Shape,以及其派生类Circle(圆)和Rect(矩形),详细讲解了继承、构造与析构函数的使用,展示了如何处理同名成员的访问问题。
摘要由CSDN通过智能技术生成

实现一个图形类(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变为虚继承

虚继承中的基类称为,虚基类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值