如何处理父类中未使用的变量? [关闭]
Posted
技术标签:
【中文标题】如何处理父类中未使用的变量? [关闭]【英文标题】:How to handle unused variable in parent class? [closed] 【发布时间】:2014-08-25 17:54:37 【问题描述】:假设我正在编写一个任何人都可以访问的库文件。
我的图书馆设计是这样的。
Class College
int no_of_staffs;
string Name;
int Area;
string head;
int rating ;
Class Department : Class College
Class Clas-s-room : Class Department
string Leader;
在为 C 创建实例时,也会为 A 类成员分配内存。
我不会在任何情况下都使用 A 的所有成员。但是在创建实例时,将为它们分配内存。但这似乎是在不必要地浪费内存。
设计是否有问题或有什么方法可以处理这个问题
【问题讨论】:
为什么 A 中需要某些东西,而 C 中不需要?我有一种感觉,您在滥用继承,或者您至少可以做得更好,但是对于受限示例,这是不可能的。你能举一个例子,说明为什么派生类没有使用基类中的某些东西吗? 这表明存在设计缺陷恕我直言。您在示例中给出的内容无法从一般 POV 中回答您的问题。可能是你有一个 XY 问题。每当您使用继承时,您都应该认真询问class C
is a class B
和 class B
is a class A
,这些可以在任意的接口级别(这种情况很少发生)。
@Vinoth,请查看我的回答。我认为您可能需要重新考虑您的设计。
【参考方案1】:
如果我有一个Animal
类,它可能有一个bool can_fly
字段,因为它适用于从它继承的每个类(Lion
、Monkey
、Hawk
等...)。如果A
的成员变量不是这样,那么您的设计就是错误的。
我不会将int max_flying_height
变量放入Animal
,因为它不适用于Monkey
或Lion
。我可能有另一个类Bird
,它继承自Animal
,并有一个int max_flying_height
成员变量那里。
编辑
查看您的编辑,我认为您对何时使用继承感到困惑。想想“is a”与“has a”规则(如果您有“has a”关系,则添加成员变量。如果您有“is a”关系,则添加继承)。
在我的示例中,Lion
是 Animal
,所以它继承。在您的示例中,教室是一个部门吗?或者一个部门有教室吗?或许系班应该有std::vector
的教室?
【讨论】:
【参考方案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
的对象的其余部分,或者它可以是随机内存,或者不同的变量,或其他。
【讨论】:
以上是关于如何处理父类中未使用的变量? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章