条款12:确定你的public继承塑膜出is-a关系:
这个条款主要将了一些特殊情况:比如企鹅是鸟,企鹅可以继承于鸟,但是鸟会飞,企鹅却不能飞;还有让正方形继承矩形可能也会造成这种尴尬!
这个问题以前想过,但是不知道怎么解决,如果现实生活当中确实要这么使用:比如 猫 狗 鱼 猪等等许多动物继承Animal类,但是猫狗等不会游泳,
假如这里是有很多动物,不能采用鱼里面专门加一个方法! 这个现在还没想出来,条款12也没有讲如果要这么用该怎么处理就是将要避免这样。
is - a;
在面向对象程序设计里面,ia - a指的是类的父子继承关系;
public继承就意味着 is - a ,适用于base - class 身上的每一件事情也一定适应于derived class身上。因此每一个子类对象也是一个父类对象。
条款13:避免遮掩继承而来的名称:
这个条款主要讲了遮掩继承,其实也就是我们经常说的 重载 重写(覆盖) 隐藏;下面就看一下 重载 重写 隐藏的区别:
1、重载的特征:在同一个类中;函数名字相同;参数不同;virtual 关键字可有可无。
2、重写(覆盖)特征是:分别位于派生类与基类;函数名字相同;参数相同;基类函数必须有virtual 关键字(这点非常要注意)。
关于隐藏:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
2、 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与重写混淆)。
// 06.cpp : 定义控制台应用程序的入口点。 // /************************************************************************/ /* 目的:找出重载、重写、隐藏的区别 时间:2014年12月1日 19:06:03 */ /************************************************************************/ #include "stdafx.h" #includeusing namespace std; class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int) //重载,在同一个类当中或者说同一个工作区间内。 { cout<<"调用基类的mf1函数"<
上面的代码应该很好的解释了三者的区别;在条款33里面说道如果不想子类隐藏父类的函数,那么在子类当中用using 声明式达到目标:
class Derived:public Base { public: virtual void mf1() { cout<<"调用子类的mf1函数"<