对象成员变量还是继承?

Posted

技术标签:

【中文标题】对象成员变量还是继承?【英文标题】:Object member variable or inheritence? 【发布时间】:2018-07-18 19:44:20 【问题描述】:

我一直在练习继承,我发现自己在问“拥有”关系到底是什么。

如果我有一个类circleType 并且我想创建一个类cylinderType,那么从circleType 派生cylinderType 和只在cylinderType 的定义中包含一个circleType 对象成员有什么区别?

class cylinderType :
public circleType

public:
    cylinderType();
    ~cylinderType();

private:
    double * height;
;

或者:

class cylinderType

public:
    cylinderType();
    ~cylinderType();

private:
    circleType baseOfCylinder;
;

【问题讨论】:

圆柱真的是圆的一种吗? 圆柱的底面是一个圆。 没错。这告诉我,上面的第二个选项是圆和圆柱之间关系的最佳反映。 我相信@AlexJohnson 试图提出的观点是第一个示例违反了Liskov Substitution Principle。如果不能将圆柱体用作圆,则它不应该是圆。 一般来说,显着的区别是“is-a”会继承接口。 “有”不会。在您的具体示例中,圆柱体有一个圆圈,但圆柱体不是一个圆圈。 【参考方案1】:

当 is-a 关系不成立时,更喜欢组合而不是继承。在这种情况下,圆柱体不是一种圆,因此(公共)继承是不合适的。

请记住,从另一个类公开继承的类可以在任何可以使用父类的地方使用。例如,给定 OP 中的定义,以下是完全有效的,即使计算圆柱的面积并没有多大意义:

double area(const circleType& circle)

    return PI * circle.radius() * circle.radius();


int main()

    cylinderType cylinder;
    std::cout << area(cylinder);

【讨论】:

以上是关于对象成员变量还是继承?的主要内容,如果未能解决你的问题,请参考以下文章

22.2 继承的 成员变量的执行顺序

子类能不能继承父类的成员变量

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

Java基础学习-extends继承(成员变量,局部变量,成员方法)

JAVA-初步认识-第十章-多态-成员变量

子类能继承父类的哪些变量和方法