假设我正在编写一个可供任何人访问的库文件。
我对图书馆的设计是这样的。
Class College
{
int no_of_staffs;
string Name;
int Area;
string head;
int rating ;
}
Class Department : Class College
{
}
Class Classroom : Class Department
{
string Leader;
}
在为C创建实例时,内存也将分配给A类成员。
在任何情况下我都不会使用A的所有成员。但是在创建实例时,将为它们分配内存。但它似乎不必要地浪费记忆。
设计明智是出了什么问题,还是有办法解决这个问题
答案 0 :(得分:3)
如果我有一个Animal
类,它可能有一个bool can_fly
字段,因为它适用于从中继承的每个类(Lion
,Monkey
,{{ 1}}等等......)如果Hawk
的成员变量不是这样,那么你的设计是错误的。
我不会在A
中添加int max_flying_height
变量,因为它不适用于Animal
或Monkey
。我可能但是有另一个类Lion
继承自Bird
并且Animal
成员变量那里。
修改强>
查看您的编辑,我认为您对何时使用继承感到困惑。想想"是" vs."有一个"规则(如果你有"有一个"关系,那么添加一个成员变量。如果你有"是"关系,那么添加继承)。
在我的示例中,int max_flying_height
是 Lion
,因此它会继承。在你的例子中,教室是一个部门吗?或者部门有教室吗?也许部门班应该有Animal
个教室?
答案 1 :(得分:2)
无法阻止子类继承其超类的所有数据成员。面向对象继承背后的想法是,如果C
继承自B
,那么C
的实例也是 B
的实例
例如,假设您有一个函数myFunc(B b);
。在函数的某个地方,它访问成员b.e
。现在,您的成像C
继承自B
但不包含成员int e
。如果您尝试将其传递给myFunc()
,则会成功,因为C
是 B
,但myFunc()
会尝试访问不存在的成员。这毫无意义。
还有技术原因,与内存中类的布局有关,这使得这种情况无法实现。当子类在内存中布局时,超类的所有成员都是第一个,然后是子类的所有成员。这意味着内存中对C
的引用可以相同的引用,无论函数是否认为这样的引用是B
或C
。如果它是C
,则函数知道整个变量;如果它是B
,那么它只知道B
通常何时结束,后来的内容可以是使其成为C
的对象的其余部分,或者它可以是随机记忆,或不同的变量,或其他什么。