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

相关文章推荐

Effective C++读书笔记(条款35-40)

____________________________________________________________________________________________________...

【Effective c++ 读书笔记】条款01 视 C++ 为一个语言联邦

一开始,C++只是 C 加上一些面向对象的特性。C++最初的名称 C with Classes 也反映了这个血缘关系。但是,现在,当这个语言逐渐成熟,它变得更活跃更无拘束,更大胆冒险,开始接受不同于 ...

effective C++(第三版)读书笔记一——条款一:视C++为一个语言联邦

终于拿到《Effective C++》了,是侯捷翻译的,哈哈,首先说新版本的装订质量堪称一流啊,用的是比较厚但很轻的那种纸,拿在手里就有一种很想读的欲望啊…… 哈哈,今天先开个头,看了前面的导读...
  • nktxsj
  • nktxsj
  • 2011年05月22日 00:00
  • 308

Effective c++ 学习笔记——之条款1:视C++为一个语言联邦

今天开始学习Effective c++,保持一周两个条目的学习。 1.让自己习惯C++        前天慕名买了这本传说中很神的书,有评论说学c++的分两种人,一种人是看过Effective c...

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

virtual函数在派生中经常用到,在遇到一些问题时用virtual函数没问题,但是有时候我们应该思考一下是否有替代方案,以此来拓宽我们的视野。...

std::tr1::function 的资料--------effective C++ 条款 35相关

本文转自:http://www.cnblogs.com/qlee/archive/2011/07/04/2097594.html    感谢前辈对我的帮助 在C++的TR1中(Technol...

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

Effective Modern C++ 条款35

Effective C++ 条款35:为虚函数寻求替代方案

原书内容: 策略模式:通过tr1::function模板实现 如果你对模板和模板的隐式接口的用法(参见第41条)很熟悉的话,那么上述的“基于函数指针”的方案就显得十分蹩脚了。旧的方案必须使用一个函...
  • ozwarld
  • ozwarld
  • 2012年02月21日 15:19
  • 627

effective C++笔记之条款43: 明智地使用多继承(MI)

l        多继承带来了单继承中绝对不会存在的复杂性。最基本的一条是二义性。如果一个派生类从多个基类继承了一个成员名,所有对这个名字的访问都是二义的;你必须明确地说出你所指的是哪个成员。如下所示...
  • lifu119
  • lifu119
  • 2012年04月04日 15:21
  • 1694

《Effective C++ 》学习笔记-第六章 条款37:绝不重新定义继承而来的缺省参数值

Never redefine a function's inherited default parameter value
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:effective C++笔记之条款35: 使公有继承体现“是一个”的含义
举报原因:
原因补充:

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