如何在父类中处理未使用的变量?

时间:2014-08-25 17:54:38

标签: c++ inheritance design-patterns

假设我正在编写一个可供任何人访问的库文件。

我对图书馆的设计是这样的。

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的所有成员。但是在创建实例时,将为它们分配内存。但它似乎不必要地浪费记忆。

设计明智是出了什么问题,还是有办法解决这个问题

2 个答案:

答案 0 :(得分:3)

如果我有一个Animal类,它可能有一个bool can_fly字段,因为它适用于从中继承的每个类(LionMonkey,{{ 1}}等等......)如果Hawk的成员变量不是这样,那么你的设计是错误的。

我不会在A中添加int max_flying_height变量,因为它不适用于AnimalMonkey。我可能但是有另一个类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的引用可以相同的引用,无论函数是否认为这样的引用是BC。如果它是C,则函数知道整个变量;如果它是B,那么它只知道B通常何时结束,后来的内容可以是使其成为C的对象的其余部分,或者它可以是随机记忆,或不同的变量,或其他什么。