让编程改变世界
Change the world by program
课后思考题解答
关于从基类继承来的方法和属性的保护:
class Pig : public Animal { … }
C++ 不仅允许你对在类里定义的方法和属性实施访问控制,还允许你控制子类可以访问基类里的哪些方法和属性。
public
是在告诉编译器:继承的方法和属性的访问级别不发生任何改变 – 即 public 仍可以被所有代码访问,protected 只能由基类的子类访问,privat 则只能由基类本身访问。
protected
把基类的访问级别改为 protected , 如果原来是 public 的话。这将使得这个子类外部的代码无法通过子类去访问基类中的 public 。
private
是在告诉编译器从基类继承来的每一个成员都当成 private 来对待,这意味着只有这个子类可以使用它从基类继承来的元素。
乱?!烦?!不怕,一般都只用 public 而已!
覆盖方法
通过之前的学习,我们已经知道了如何通过创建新的子类来重用现有的代码(继承)。 虽然这个方案可以让我们轻松解决许多现实世界里的问题,但在某些场合,却又显得不够用。 例如当我们需要在基类里提供一个通用的函数,但在它的某个子类里需要修改这个方法的实现,在 C++ 里,覆盖(overriding)就可以做到。 回到我们之前的例子,我们都知道,但凡是个动物都知道吃!那么吃我们就可以说是动物的一个共同特征,但我们知道不同动物会有不同的吃法。。。。。。 C++ 可以让我们很容易实现这种既有共同特征又需要在不同的类里有不同实现的方法。 我们需要做的是在类里重新声明这个方法,然后再改写一下它的实现代码(就像它是一个增加的方法那样)就行啦。 修改例题:为我们的 Animal 添加 eat()方法,并在Pig 和 Turtle 中覆盖。
重载方法
简化编程工作和提高代码可读性的另一种方法是对方法进行重载。 重载机制使你可以定义多个同名的方法(函数),只是它们的输入参数必须不同。(因为编译器是依靠不同的输入参数来区分不同的方法) 重载并不是一个真正的面向对象特性,它只是可以简化编程工作的捷径,而简化编程工作正式 C++ 的全部追求! 我们来测试下对 eat()方法进行重载:test (课件及源代码)
新手应该注意
对方法(函数)进行重载一定要有的放矢,重载的方法(函数)越多,程序就越不容易看懂。 在对方法进行覆盖(注意区分覆盖和重载)时一定要看仔细,因为只要生命的输入参数和返回值与原来的不一致,你编写出来的就将是一个重载 方法而不是覆盖方法。这种错误以小甲鱼的个人经验告诉你:往往很难调试! 对从基类继承来的方法进行重载,程序永远不会像你预期的那样工作!