【问题标题】:Is there a way to make a derived class not inherit all the members from the base class?有没有办法让派生类不继承基类的所有成员?
【发布时间】: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”关系。椭圆不是圆。
  • 不确定是否应该将circleellipse 中的一个作为另一个的子类。从数学上讲,circleellipse 之间可能存在“是”关系,但在您的程序中不一定有一个:circle::get_radius()ellipse::get_radius1() 都不是这两个类的一部分,因此其中一个没有可用的操作类型是其他类型的子集。您最好将计算派生属性的逻辑移至辅助函数,也就是说,如果您想完全共享逻辑;另一种选择是允许ellipse c = ellipse::create_circle(r);(无类型圆)

标签: c++ class inheritance


【解决方案1】:

这是不可能的。当您从ellipse 派生circle 时,实际上它与将circle 类型的成员变量添加到ellipse 非常相似。 (而且您也不能将circle 的一半添加为成员变量。)

一个可能的解决方案(不一定更有效)是创建一个派生自figure 的抽象类,为两个半径使用纯虚拟getter,并根据它们实现area()。然后circleellipse 都可以从这个类派生,为半径添加成员变量,为它们添加setter,并覆盖getter。决定如何处理 perimeter() 留给读者作为练习。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多