本文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. HDOJ/HDU 2717 Catch That Cow 一维广度优先搜索 so easy..............

    看题:http://acm.hdu.edu.cn/showproblem.php?pid=2717 思路:相当于每次有三个方向,加1,减1,乘2,要注意边界条件,减1不能小于0,乘2不能超过最大值. ...

  2. CheckBox和RadioButton以及RadioGroup

    CheckBox:复选框 有两种状态 选中状态(true),未选状态(false) 属性 android:checked= "false"(表示该复选框未被选中) RadioGro ...

  3. 开发腾讯移动游戏平台SDK Android版Ane扩展 总结

    本文记录了在开发 腾讯移动游戏平台SDK(MSDK) Android版Ane扩展 过程中所遇到的问题和相关解决方式 问题一:编译报错:Unable to resolve target 'android ...

  4. Erlangserver紧内存优化解决方案

    提出的问题:server100万人在线,16G内存快被吃光. 玩家进程占用内存偏高 解决方法: 第一步: erlang:system_info(process_count). 查看进程数目是否正常,是 ...

  5. jQuery Mobile 是创建移动 web 应用程序的框架。

    jQuery Mobile jQuery Mobile 是创建移动 web 应用程序的框架. jQuery Mobile 适用于所有流行的智能手机和平板电脑. jQuery Mobile 使用 HTM ...

  6. CCLuaObjcBridge调Objective-C方法传索引数组报invalid key to 'next'错调试

    CCLuaObjcBridge是cocos2d-x系列引擎与Objective-C进行交互的"桥梁",老廖的quick-cocos2d-x在其framework进行了简单了封装,封 ...

  7. Functor仿函数

    转载声明:本文转自网络,稍加整理以备学习和參考之用. 函数对象/仿函数 提到C++ STL.首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭 ...

  8. struts(三)——struts框架实现登录示例

    前两篇讲解了struts框架的基本实现,自己感觉讲的也有些枯燥,今天拿登录的例子来做一个实现. 1.新建一个javaweb项目,并将struts的jar包拷贝到WebRoot/WEB-INF/lib下 ...

  9. CMS垃圾回收机制

    详解CMS垃圾回收机制   原创不易,未经允许,不得转载~~~ 什么是CMS? Concurrent Mark Sweep. 看名字就知道,CMS是一款并发.使用标记-清除算法的gc. CMS是针对老 ...

  10. MySQL 触发器结构及三个案例demo

    --你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了.这跟SQL的标准有所不同. CREATE TRIGGER语法 CREATE TRIGG ...