C++有三种继承方式:
①公有继承;
②保护继承;
③私有继承。
公有继承是一种is-a关系(也可以理解为is-a-kind-of,一种,但is-a是术语)。任何可以对基类执行的操作,也可以对派生类执行。
(1)公有继承不建立has-a关系,即一个类中包含另一个类。例如:
class Name
{....
}
class Student
{
Name name;
int id;
....
}
就是一种has-a关系,将Name对象作为Student类的数据成员。
(2)公有继承不能建立is-like-a 关系。
不确定:这个关系貌似是指先有一个共同的类,然后以is-a关系或has-a关系,在这个共同的类的基础上定义的相关的两个/多个类。
继承可以在基类的基础上添加属性,但不能删除基类的属性。
(3)公有继承不建立is-implemented-as-a(作为...来实现)关系。
例如,数组可以用于实现栈,但不能从数组类派生出栈类来,因为栈不是数组,且也可以通过其他方法来实现栈(如链表)。
不过不明白书上这一句:正确方法是,通过让栈包含一个私有Array对象成员来隐藏数组实现。——这句话意思是这种方法是用数组实现栈的方式么?强调说不能从数组派生出栈?我觉得是。
(4)公有继承不建立uses-a关系。
例如A类和B类关系并不大(但有一点关系),然后从A类派生出B类,理论上是可以实现的,只不过这样A类很多数据成员、方法就没意义了。
在C++中,可以使用公有继承来建立has-a、is-implemented-as-a或uses-a关系,然而,这样做,按书上说法是会导致编程方面的问题,因此应使用is-a关系。
时间: 2024-12-24 22:09:43