对象成员变量还是继承?
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);
【讨论】:
以上是关于对象成员变量还是继承?的主要内容,如果未能解决你的问题,请参考以下文章
子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法