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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值