effective C++笔记之条款35: 使公有继承体现“是一个”的含义

原创 2012年03月25日 11:38:12

D (Derived)公有继承于B(Base),实际上是:类型D的每一个对象也是类型B的一个对象,但反之不成立;B是一个比D更广泛的概念,D表示一个比B更特定概念;是在声明:任何可以使用类型B的对象的地方,类型D的对象也可以使用,因为每个类型D的对象是一个类型B的对象。相反。如果需要一个类型D的对象,类型B的对象就不行:每个D是一个B,但反之不成立。

 

1. 如下典型例子:

class Person{};
class Student : public Person {}

每个学生是人,但并非每个人使学生。任何对人成立的事实---如都有生日---也对学生成立;任何对学生成立的事实---如都在学校上课----也对人成立。人的概念比学生的概念更广泛;学生是一种特定类型的人。

2. 私有继承是完全另外一回事(42)。

3. Student是一个Person的事实并不说明Student的数组是一个Person数组。(M3

4. 企鹅与鸟的例子,直接公有继承会出现问题,因为企鹅不会飞,鸟会飞。有两种解决方法,如下所示:

ü        增加一种层次结构:

class Bird{ …};   //没有声明fly函数
class FlyingBird: public Bird
{
public:
         virtual void fly();
}
class NonFlyingBird : public Bird
{
…  //没有声明fly函数
} ;
class Penguin :public NonFlyingBird
{
…  //没有声明fly函数
};   

ü        对penguin重新定义fly函数,使之产生一个运行时错误。

void error(const string&msg);
class Bird
{
public:
         virtual void fly();
};

class Penguin :public Bird
{
public:
         virtual void fly() { error(“Penguins can’t fly!”); } //重写基类虚函数
};

ü        两种方法一种是在编译时检测错误,一种是在运行时发现错误。

5. 正方形与长方形的例子。正方形是一种矩形,但用公有继承来做不适用。最根本的问题在于:对矩形适用的规则(宽度的改变和高度没关系)不适用于正方形(宽度和高度必须相同)。

条款 35: 使公有继承体现"是一个" 的含义

C++面向对象编程中一条重要的规则是:公有继承意味着"是一个"  。一定要牢牢记住这条规则。         当写下类 D("Derived"  )从类 B("Base")公有继承时,你实际上是在告...
  • lujiandong1
  • lujiandong1
  • 2014年12月31日 16:37
  • 319

《Effective C++》:条款35:考虑virtual函数以外的其他选择

virtual函数在派生中经常用到,在遇到一些问题时用virtual函数没问题,但是有时候我们应该思考一下是否有替代方案,以此来拓宽我们的视野。...
  • KangRoger
  • KangRoger
  • 2015年03月02日 21:12
  • 2062

effective c++ 条款35: 使公有继承体现 "是一个" 的含义

条款35: 使公有继承体现 "是一个" 的含义  条款35: 使公有继承体现 "是一个" 的含义 在"Some Must Watch While Some Must Sleep"( W. H. ...
  • fengxinziyang
  • fengxinziyang
  • 2010年09月24日 13:29
  • 290

《Effective C++》学习笔记——条款35

条款 35:考虑virtual函数以外的其他选择
  • lx417147512
  • lx417147512
  • 2016年02月22日 00:29
  • 656

Effective Modern C++ 条款35 比起基于线程编程,更偏爱基于任务编程

Effective Modern C++ 条款35
  • big_yellow_duck
  • big_yellow_duck
  • 2016年09月11日 16:06
  • 1004

《Effective C++》:条款28-条款29

条款28避免返回handles指向对象内部成分:指的是不能返回对象内部数据/函数的引用、指针等。 条款29为异常安全而努力是值得的:指的是要有异常处理机制,避免发生异常时造成资源泄露等问题。...
  • KangRoger
  • KangRoger
  • 2015年02月19日 19:47
  • 1399

Effective C++ 条款2

尽量以const、enum、inline替换#define首先,大家要明白一个道理。#define是什么,有什么作用。很简单,大家都知道#define实现宏定义,如下代码:#define Flag 1...
  • u011058765
  • u011058765
  • 2015年06月19日 12:06
  • 502

《Effective C++》:条款41-条款42

条款41了解隐式接口和编译期多态 条款42了解typename的双重意义条款
  • KangRoger
  • KangRoger
  • 2015年03月10日 22:13
  • 1250

《Effective C++》:条款44-条款45

条款44将与参数无关的代码抽离templates 条款45运用成员函数模板接受所有兼容类型...
  • KangRoger
  • KangRoger
  • 2015年03月12日 22:01
  • 1512

《Effective C++》资源管理:条款13-条款15

在系统中,资源是有限的,一旦用完必须归还给系统,否则可能会造成资源耗尽或其他问题。例如,动态分配的内存如果用完不释放会造成内存泄漏。 这里说的资源不仅仅是指内存,还包括其他,例如文件描述符、网络连接、...
  • KangRoger
  • KangRoger
  • 2015年01月14日 21:46
  • 1336
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++笔记之条款35: 使公有继承体现“是一个”的含义
举报原因:
原因补充:

(最多只允许输入30个字)