C++ 有没有办法使派生类不继承基类的所有成员?

C++ 有没有办法使派生类不继承基类的所有成员?,c++,class,inheritance,C++,Class,Inheritance,所以我把elipse作为一个基类,它的成员有两个双倍体,代表两个半径。 我想从中派生一个圆类。圆只需要一个半径作为成员,但它仍然从elipse继承了两个半径。我觉得我在浪费记忆。在这种特殊情况下,这没什么大不了的,但我认为在其他情况下可能会发生。 p、 s.elipse也是从作为接口的figure类派生的 以下是3个类的标题: 图h #pragma once #define PI 3.1415 class figure { public: virtual double area()

所以我把elipse作为一个基类,它的成员有两个双倍体,代表两个半径。 我想从中派生一个圆类。圆只需要一个半径作为成员,但它仍然从elipse继承了两个半径。我觉得我在浪费记忆。在这种特殊情况下,这没什么大不了的,但我认为在其他情况下可能会发生。
p、 s.elipse也是从作为接口的figure类派生的

以下是3个类的标题:

图h

 #pragma once
 #define PI 3.1415
class figure
{
public:
    virtual double area() = 0;
    virtual double perimeter() = 0;
};
elipse.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);
}

这是不可能的。当您从
椭圆
派生
时,在引擎盖下,它非常类似于将
类型的成员变量添加到
椭圆
。(您也不能将
圆的一半添加为成员变量。)


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

不。如果你非常关心空间,那么直接从图中继承。我不明白你为什么不在层次结构中走相反的路。例如,figure==>circle==>elipse,您将第二个半径添加到
elipse
中,而不是试图从
circle
中隐藏不需要的半径,我考虑过这一点,但它没有真正意义,因为circle是elipse的一种特殊情况,而不是相反around@WhozCraig继承通常表示“is-a”关系椭圆不是圆。不确定是否应将
椭圆
子类作为另一个的子类。从数学上讲,
椭圆
之间可能存在“是”关系,但在您的程序中不一定存在这种关系:既不是
圆::获取半径()
也不是
椭圆::获取半径1()
是两个类的一部分,因此其中一个类型的可用操作都不是另一个类型的子集。如果您想共享逻辑,最好将用于计算派生属性的逻辑移动到辅助函数;另一个选项是允许椭圆c=ellipse::创建_圆(r)(无类型圆圈)