Questions tagged «inheritance»

继承是面向对象编程中的系统,该系统允许对象支持由先前类型定义的操作,而不必提供自己的定义。它是面向对象编程中多态性的主要载体。

7
子类化:是否可以用常规属性覆盖属性?
该赏金过期3天。这个问题的答案有资格获得+500声望奖励。 保罗·潘泽(Paul Panzer)希望奖励现有的答案。 假设我们要创建一类类,这些类是总体概念的不同实现或专业化。假设某些衍生属性有一个合理的默认实现。我们想把它放在基类中 class Math_Set_Base: @property def size(self): return len(self.elements) 因此,在这个相当愚蠢的示例中,子类将能够自动计算其元素 class Concrete_Math_Set(Math_Set_Base): def __init__(self,*elements): self.elements = elements Concrete_Math_Set(1,2,3).size # 3 但是,如果子类不想使用此默认值怎么办?这不起作用: import math class Square_Integers_Below(Math_Set_Base): def __init__(self,cap): self.size = int(math.sqrt(cap)) Square_Integers_Below(7) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line …

1
当空基类也是成员变量时,为什么禁止空基优化?
空基优化非常棒。但是,它具有以下限制: 如果空基类之一也是第一个非静态数据成员的类型或类型的基,则禁止空基优化,因为相同类型的两个基子对象需要在对象表示中具有不同的地址最派生的类型。 要解释此限制,请考虑以下代码。该static_assert会失败。而将Foo或更改为或Bar从继承Base2将避免错误: #include <cstddef> struct Base {}; struct Base2 {}; struct Foo : Base {}; struct Bar : Base { Foo foo; }; static_assert(offsetof(Bar,foo)==0,"Error!"); 我完全了解这种行为。我不明白的是为什么存在这种特殊行为。显然添加它是有原因的,因为它是显式添加,而不是疏忽。这样做的理由是什么? 特别是为什么要要求两个基本子对象具有不同的地址?在上面,Bar是一个类型,并且foo是该类型的成员变量。我看不出为什么基类对Bar类型为的基类很重要foo,反之亦然。 确实,如果有的话,我希望它&foo与Bar包含它的实例的地址相同,因为在其他情况下它是必需的(1)。毕竟,我对virtual继承没有任何幻想,无论如何基类都是空的,并且带有的编译Base2显示在这种特殊情况下没有任何中断。 但是显然,这种推理在某种程度上是不正确的,并且在其他情况下,也需要这种限制。 假设答案应该针对C ++ 11或更高版本(我目前正在使用C ++ 17)。 (1)注意:EBO在C ++ 11中进行了升级,并且特别成为StandardLayoutTypes的必需项(尽管Bar,上面不是StandardLayoutType)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.