【发布时间】:2021-07-24 11:49:15
【问题描述】:
所以我将椭圆作为一个基类,它有两个代表两个半径的双精度数作为成员。
我想从中派生一个圆形类。 Circle 只需要一个半径作为成员,但它仍然从 elipse 继承两个。我觉得我在浪费内存。在这种特殊情况下,这没什么大不了的,但我认为在其他情况下可能。
p.s. elipse 也派生自一个图形类,它是一个接口
这是 3 个类的标题:
图.h
#pragma once
#define PI 3.1415
class figure
{
public:
virtual double area() = 0;
virtual double perimeter() = 0;
};
椭圆.h
#pragma once
#include "figure.h"
class elipse : public figure
{
protected:
double radius1, radius2;
public:
elipse(double radius1 = 0, double radius2 = 0);
void set_radius1(double);
void set_radius2(double);
double get_radius1();
double get_radius2();
double area() override;
double perimeter() override;
};
圆.h
#pragma once
#include "elipse.h"
class circle:
private elipse
{
public:
circle(double radius = 0);
double perimeter() override;
double area() override;
double get_radius();
void set_radius(double);
};
这里是 set_radius 方法的实现,表明我仍然需要设置两个半径,即使理论上我需要一个。
void circle::set_radius(double radius)
{
set_radius1(radius);
set_radius2(radius);
}
【问题讨论】:
-
没有。如果你很在意空间,那么直接从图继承。
-
我不明白你为什么不在你的层次结构中采取相反的方式。 IE。图 ==> 圆 ==> 椭圆,将第二个半径添加到
elipse,而不是试图向circle隐藏不需要的半径 -
我想过,但这并没有什么意义,因为圆是椭圆的一个特例,而不是相反
-
@WhozCraig Inheritance 通常表示“is-a”关系。椭圆不是圆。
-
不确定是否应该将
circle或ellipse中的一个作为另一个的子类。从数学上讲,circle和ellipse之间可能存在“是”关系,但在您的程序中不一定有一个:circle::get_radius()和ellipse::get_radius1()都不是这两个类的一部分,因此其中一个没有可用的操作类型是其他类型的子集。您最好将计算派生属性的逻辑移至辅助函数,也就是说,如果您想完全共享逻辑;另一种选择是允许ellipse c = ellipse::create_circle(r);(无类型圆)
标签: c++ class inheritance