C++批判系列5--继承的本质

继承的本质

继承关系是一种耦合度很高的关系,它与组合及一般化(genericity)一样,提供了OO中的一种基本方法,用以将不同的软件组件组合起来。一个类的实例同时也是那个类的所有的祖先的实例。为了保证面向对象设计的有效性,我们应该保存下这种关系的一致性。在子类中的每一次重新定义都应该与在其祖先类中的最初定义进行一致性检查。子类中应该保存下其祖先类的需求。如果存在着不能被保存的需求,就说明了系统的设计有错误,或者是在系统中此处使用继承是不恰当的。由于继承是面向对象设计的基础,所以才会要求有一致性检测。C++中对于非虚拟函数重载的实现, 意味着编译器将不会为其进行一致性检测。C++并没有提供面向对象设计的这方面的保证。

继承被分成"语法"继承和"语义"继承两部分。Saake等人将其描述如下:"语法继承表示为结构或方法定义的继承,并且因此与代码的重复使用(以及重写被继承方法的代码)联系起来。语义继承表示为对对象语义(即对象自己)的继承,。这种继承形式可以从语义的数据模型中被得知,在此它被用于代表在一个应用程序的若干个角色中出现的一个对象。"[SJE 91]。Saake等人集中研究了继承的语义形式。通过是行为还是语义的继承方式的判断,表示了对象在系统中所扮的角色。
 
然而,Wegner相信代码继承更具有实际的价值。他将语法与语义继承之间的区别表示为代码和行为上的区别[Weg 91](p43)。他认为这样的划分不会引起一方与另一方的兼容,并且还经常与另一方不一致。Wegner同样也提出这样的问题:"应该怎样抑制对继承属性的修改?"代码继承为模块化(modularisation)提供一个基础。行为继承则依赖于"is-a"关系。这两种继承方式在合适处都十分有用。它们都要求进行一致性的检测,这与实际上的有意义的继承密不可分。

看起来在语义保持关系中那些限制最多的形式中,继承似乎是其中最强的形式;子类应该保存祖先类中的所有假设。

Meyer [Meyer 96a and 96b]也对继承技术进行了分类。在他的分类法中,他指出了继承的12种用法。这些分析也给我们怎么使用继承提供了一个很好的判断标准,如:什么时候应该使用继承,什么时候不应该它。

软件组件就象七巧板一样。当我们组装七巧板时,每一块板的形状必须要合适,但更重要地是,最终拼出的图像必须要有意义,能够被说得通。而将软件组件组合起来就更困难了。七巧板只是需要将原本是完整的一幅图像重新组合起来。而对软件组件的组合会得到什么样的结果,是我们不可能预见到的。更糟的是,七巧板的每一块通常是由不同的程序员产生的,这样当整个的系统被组合起来时,对于它们的吻合程度的要求就更高了。

C++中的继承像是一块七巧板,所有的板块都能够组合在一起,但是编译器却没有办法检测最终的结果是否有意义。换句话说,C++仅为类和继承提供了语法,而非语义。可重用的C++函数库的缓慢出现,暗示了C++可能会尽可能地不支持可重用性。相反的是,Java,Eiffel和Object Pascal都与函数库包装在一起出现。Object Pascal与MacApp应用软件框架联系非常紧密。Java也从与Java API的耦合中解脱出来,取而代之的是一个包容广泛的函数库。Eiffel也同样是与一个极其全面的函数库集成在一起,该函数库甚至比Java的还要大。事实上函数库的概念已经成为一个优先于Eiffel语言本身的工程,用以对所有在计算机科学中通用的结构进行重新分类,得到一个常用的分类法。[Meyer 94].

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: C++面向对象中的类的继承与派生是指在一个类的基础上,创建一个新的类,新的类可以继承原有类的属性和方法,并且可以添加新的属性和方法,从而实现代码的复用和扩展。 在C++中,使用关键字“class”定义一个类,使用关键字“public”、“private”、“protected”定义类的访问权限。在定义一个派生类时,使用关键字“class”后面加上派生类的名称,再使用冒号“:”后面加上基类的名称,即可实现类的继承。 派生类可以访问基类中的公有成员和保护成员,但不能访问基类中的私有成员。派生类可以重载基类中的成员函数,也可以添加新的成员函数和成员变量。 类的继承与派生是C++面向对象编程中的重要概念,可以帮助程序员更好地组织代码,提高代码的复用性和可维护性。 ### 回答2: 面向对象编程中,类的继承与派生是非常重要的概念。继承是指在一个类的定义中可以基于另一个已有的类来创建一个新的类,新类会自动拥有父类的属性和方法。派生是继承的一种特殊形式,指在已有的类的基础上产生新的子类,新的子类不仅具有父类的属性和方法,还能在此基础上增加新的属性和方法。 在面向对象编程中,继承和派生的主要作用是代码重用,减少了重复代码的编写,并且提高了代码的可维护性和可扩展性。在一个类中,如果有多个方法都具有相同的实现,那么可以将这些方法定义在一个父类中,然后在子类中通过继承来重用这些方法。这样不仅能够提高代码的复用性,还能够降低代码的维护成本。 此外,继承和派生还可以让程序员更好的组织代码,划分出不同的层次,从而更好的管理代码。可以将共性的方法和属性定义在父类中,特有的方法和属性定义在子类中,这样不仅能够提高代码的可读性,还能够更好的维护和扩展代码。 但是,在使用继承和派生时,也需要注意一些问题。首先,如果继承层次过深,会使代码变得复杂,难以维护和扩展。其次,如果子类重写了父类的方法,会导致代码逻辑难以理解。此外,如果父类中的一些方法或属性在子类中没有被使用,那么就会占用不必要的内存。 因此,在使用继承和派生时,需要根据具体的情况来考虑是否使用,不应该过度使用,从而造成代码的混乱和不必要的浪费。同时,也需要注意代码的设计和划分,保持良好的代码结构和规范。 ### 回答3: 在面向对象编程中,类的继承与派生是重要的概念。类的继承是指创建一个新类,该类继承了现有类的属性和方法。派生也是继承的一种形式,是指从一个现有类中创建一个新类,并添加或修改该类的特定属性或方法。 类的继承可以提高代码的可重用性和可维护性。当一个新类继承自一个父类时,它自动继承父类的属性和方法,这意味着开发人员可以重复使用父类的代码。如果需要修改父类的属性或方法时,不需要修改所有继承该类的子类,只需修改基类即可,这有助于提高代码的可维护性。 在类的继承中,子类可以覆盖其父类的方法,这是一种多态性的实现。当调用一个子类对象的方法时,会优先调用子类的方法,如果子类没有实现该方法,那么将会调用父类的方法。 派生则是在继承的基础上创建一个新类,该新类继承父类的特定属性和方法,并添加或修改某些内容。通过这种方式,开发人员可以为不同的应用场景创建定制的类,这可以提高应用程序的灵活性。 在类的继承和派生中,需要注意一些最佳实践。一旦一个类被继承,它的接口就不能轻易地修改。否则所有继承的类都需要相应地进行更改。此外,应避免使用多层次的继承或派生,这会导致代码过于复杂和难以理解。 综上所述,类的继承与派生是面向对象编程中的重要概念。通过继承和派生,可以提高代码的可重用性和可维护性,实现多态性以及创建定制的类。然而,在应用这些概念时,应该遵循良好的最佳实践,以确保代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cber

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值