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

结论:

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


        public继承意味着“is-a”关系。它的意思是:如果B以public形式继承自A,那么B类型对象肯定是一个A对象,反之不成立。A是B的一种抽象,B是A的特例。任何使用A的地方,都能使用B。

public继承意味着“is a”(是一种)关系:

(1)任何一个继承类对象也是一个基类对象;

(2)任何可以出现基类对象的地方也可以出现一个继承类对象(例如函数的实参);

(3)任何一个可以在基类对象上所做的操作,同样也可以在派生类上操作(结果可能是设计者想要的,也可能是不想要的):“可以”是指编译器不报错,但是如果它违反了设计者的意愿,应当采用“让编译器报错”的方式来显示错误,这比“运行时报错”要好。


例如Person类有eat(),sleep()等行为,而Student还会有study()在校学习这个动作。那么符合public继承特点,可以让Student继承Person:

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

C++领域,任何函数如果期望获得一个类型为Person(或Person的指针或引用)的实参,都也愿意接受一个Student对象(或Student对象的指针或引用):

void (const Person & p);  //任何人都会吃
void study(const Student& s);   //只有学生会在校学习
Person p;
Student s;
eat(p);      //没问题,所有人都可以吃
eat(s);      //没问题,学生是人,可以吃饭
study(s);    //没问题,学生在校学习
study(p);    //错误,p不是学生

但是下面的例子就不适合用public继承,因为它不是Is-a关系:

企鹅是一种鸟,这是事实;鸟可以飞,这也是事实。但是企鹅不会飞。那么:

class Bird {
public:
      virtual void fly();   //鸟可以飞
};

class Penguin: public Bird {  //企鹅是一种鸟
      ...
};
那么,当Penguin类继承了Bird,是否就意味这企鹅可以继承fly函数,这显然错误。

关于penguin和bird类之间的关系修改以及存在问题参考文章:条款32:确定你的public继承塑模出is-a关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值