本答案选择的是(b),基类为基本图元,抽象类,其中有两个共有纯虚函数,一个返回图元面积,一个返回图元体积。

        有两个中间类,分别是二维图元与三位图元,其中二维图元体积返回0.0,且被定义为不能被子类重写。

        有四个派生类,如题所示,所有数据皆为私有。下面是本文正式内容。

/**
****************************************************************************************
* @class: Graph
* @details: Graph类是一个抽象基类,用于表示各种图形。定义了返回面积和体积的接口
*
* @method:getArea,返回面积的抽像接口
* @method:getVolume,返回体积的抽像接口
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class Graph
{
public:
    virtual double getArea() = 0;
    virtual double getVolume() = 0;
};
/**
****************************************************************************************
* @class: TwoDimensionGraph
* @details: TwoDimensionGraph类是中间类,将基类一部分划分为二位图形
*
* @method:getArea,返回面积的抽像接口
* @method:getVolume,二位体积为零,返回零
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class TwoDimensionGraph : Graph
{
public:
    virtual double getArea() = 0;
    virtual double getVolume() final { return 0.0; };
};
/**
****************************************************************************************
* @class: ThreeDimensionGraph
* @details: ThreeDimensionGraph类是中间类,将基类一部分划分为三位图形
*
* @method:getArea,返回面积的抽像接口
* @method:getVolume,返回体积的抽像接口
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class ThreeDimensionGraph : Graph
{
public:
    virtual double getArea() = 0;
    virtual double getVolume()=0;
};
/**
****************************************************************************************
* @class: square
* @details: square,表示矩形
*
* @method:getArea,返回矩形面积
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class Square : TwoDimensionGraph
{
public:
    Square(double i = 0, double j = 0) : l(i), h(j) {}
    virtual double getArea() override { return l * h; }

private:
    double l; // 长
    double h; // 宽
};
/**
****************************************************************************************
* @class: Circular
* @details: Circular,表示圆形
*
* @method:getArea,返回圆形面积
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class Circular : TwoDimensionGraph
{
public:
    Circular(double i = 0) : r(i) {}
    virtual double getArea() override { return 3.1415 * r * r; }

private:
    double r; // 半径
};
/**
****************************************************************************************
* @class: Sphere
* @details: Sphere,表示球形
*
* @method:getArea,返回球形面积
* @method:getVolume,返回球形体积
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class Sphere : ThreeDimensionGraph
{
public:
    Sphere(double i = 0) : r(i) {}
    virtual double getArea() override { return 3.1415 * r * r * 4; }
    virtual double getVolume()override { return 3.1415 * r * r *r* 3/4; };

private:
    double r; // 半径
};
/**
****************************************************************************************
* @class: Cone
* @details: Cone,表示圆锥
*
* @method:getArea,返回圆锥面积
* @method:getVolume,返回圆锥体积
*
* @author: YMM
* @version: 1.0
* @date: 20240525
****************************************************************************************
*/
class Cone : ThreeDimensionGraph
{
public:
    Cone(double i = 0) : r(i) {}
    virtual double getArea() override { return 3.1415 * r * r * h; }
    virtual double getVolume()override { return 3.1415 * r * r * h*1/3; };

private:
    double r; // 底面半径
    double h;//高
};
05-30 08:08