本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie

经验:"public继承"意味 is-a。适用于 base classes 身上的每一件事情一定也适用于 derived classes 身上,

由于每个 derived classes 身上,由于每个 derived class 对象也都是一个 base class 对象。

演示样例:

class Person {...};
class Student: public Person {...}; void eat(const Person &p); //不论什么人都会吃
void study(const Student &s); //仅仅有学生才到校学习
Person p; //p 是人
Student s; //s 是学生
eat(p); //ok p是人
eat(s); //ok s是学生。但学生也是(is-a)人
study(s); //ok s是学生
study(p); //error p不是学生

解析:上面的样例仅仅对 public继承才成立。 对private, protected 继承不成立。



public 继承的问题演示样例

1.企鹅是一种鸟。鸟会飞,但企鹅不会飞

class Bird{
public:
virtual void fly(); //鸟能够飞
};
class Penguin: public Bird{ //企鹅是一种鸟
};

假设你的软件系统如今以及未来不须要差别会不会飞的鸟的话。

这种“双classes继承体系”就能够了,否则能够进行例如以下更改

class Bird{
//... -->没有声明 fly 函数,鸟不一定会飞
};
class FlyingBird: public Bird{
public:
virtual void fly();
}; class Penguin: public Bird{
//... -->没有声明 fly 函数
};

2.class Square 应该以 public 形式继承 class Rectangle 吗?

class Rectangle{
virtual void setHeight(int newHeight);
virtual void setWidth(int newWidth);
virtual int height() const; //返回当前值
virtual int width() const;
//...
}; void makeBigger(Rectangle &r) //这个函数用以添加 r 的面积
{
int oldHeight = r.height();
r.setWidth(r.width() + 10); //为 r 的宽度加10
assert(r.height() == oldHeight); //推断 r 的高度是否未曾改变
} class Square: public Rectangle {...};
Square s;
//...
assert(s.width() == s.height()); //这对全部正方形一定为真
makeBigger(s); //因为s 是一种(is-a)矩形。所以我们添加其面积。
assert(s.width() == s.height()); //对全部正方形应该仍然为真 --> 但其实因为上一步 makeBigger函数返回。这已经不是真的

版权声明:本文博主原创文章,博客,未经同意不得转载。

Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联的更多相关文章

  1. 读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型

    1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”.记住这个准则. 如果你实现一个类D(derived)public继承自类B(ba ...

  2. Effective C++ 笔记:条款 32 确定你的public继承塑造出正确的is-a关系

    32 : Make sure public inheritance models "is-a." 0 引言 Inheritance and Object-Oriented Desi ...

  3. 读书笔记 effective c++ Item 4 确保对象被使用前进行初始化

    C++在对象的初始化上是变化无常的,例如看下面的例子: int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: class Point { int x,y; ...

  4. 条款32:确定你的public继承塑模出is-a的关系

    Make sure public inheritance models "is –a " 如果令clsss D 以public的形式继承class B,你便是告诉编译器说,每一个类 ...

  5. effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  6. 读书笔记 effective c++ Item 38 通过组合(composition)为 “has-a”或者“is-implemented-in-terms-of”建模

    1. 什么是组合(composition)? 组合(composition)是一种类型之间的关系,这种关系当一种类型的对象包含另外一种类型的对象时就会产生.举个例子: class Address { ...

  7. 读书笔记 effective c++ Item 39 明智而谨慎的使用private继承

    1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用 ...

  8. 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  9. Effective C++ -----条款32:确定你的public继承塑模出is-a关系

    “public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...

随机推荐

  1. 在不同版本号hdfs集群之间转移数据

    在不同版本号hdfs集群之间转移数据     最简单的办法就是把src集群的数据导到本地,然后起还有一个进程将本地数据传到des集群上去. 只是这有几个问题: 效率减少 占用本地磁盘空间 不能应付实时 ...

  2. Xshell怎样登陆本地虚拟机

    Xshell怎样登陆本地虚拟机 本经验介绍了怎样使用Xshell登陆本地虚拟机,这里以centos为例.其实其它远程登陆,原理也是一样的.   工具/原料 VMware虚拟机 Xshell远程登陆工具 ...

  3. 修改emlog后台登录路径的方法(转)

    emlog后台登录地址的目录名称默认为admin,并且官方没有提供自定义后台登录入口名字的功能,这多少让我们觉得有些不安全,毕竟暴露一个网站的后台不是一件安全的事,今天就给您说下修改方法,增加一下网站 ...

  4. Beijing seminar: China shadow banking

    Beijing seminar: China shadow banking-张化桥-财新博客-新世纪的常识传播者-财新网 Beijing seminar: China shadow banking

  5. Django写的投票系统4(转)

    原文地址:http://www.cnblogs.com/djangochina/archive/2013/06/04/3114269.html 现在已经可以在后台管理投票了,现在就差怎么在前台显示和如 ...

  6. HDOJ 4249 A Famous Equation DP

    DP: DP[len][k][i][j] 再第len位,第一个数len位为i,第二个数len位为j,和的第len位为k 每一位能够从后面一位转移过来,能够进位也能够不进位 A Famous Equat ...

  7. JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

  8. 【转向Javascript系列】深入理解Web Worker

    本文首发在alloyteam团队博客,链接地址http://www.alloyteam.com/2015/11/deep-in-web-worker/ 上一篇文章<从setTimeout说事件循 ...

  9. php中遍历数组的方法

    参考网址:http://www.jb51.net/article/29949.htm 这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为 ...

  10. 3DMax的OFusion插件使用问题

    使用OFusion将3D max场景导出为Ogre的Mesh是非经常常使用的方法.这里汇总一些问题方便查阅. 1.OFusion获取: http://download.csdn.net/detail/ ...