再谈C++中的is-a关系(确定你的public继承塑模出is-a关系)

博客《浅析C++中的is-a和has-a关系(公有继承、包含、私有继承)》中讲诉了C++中is-a和has-a的区别。现在就is-a关系再深入一点探讨。

如果class D 以public形式继承class B,你的意图就是告诉编译器:每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。

例如,每个学生都是人,但并非每个人都是学生,因此可以实现is-a:

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

接下来我们可以得到:任何一个函数如果期望获得一个类型为Person的实参,那么都愿意接受一个Student对象。

void eat(const Person &p);//任何人都会吃
void study(const Student & s);//只有学生学习
Person p;
Student s;
eat(p);
eat(s);
study(s);
study(p);//错误!

公有继承和is-a关系看似简单,其实往往容易误导你!
比如说:
企鹅是一种鸟
鸟可以飞
企鹅不会飞
如果我们采用了共有继承:

class Bird
{
public:
    virtual void fly();
};

class Penguin:public Bird
{
};

但是实际情况是企鹅不会飞,我们需要做特俗的处理。要么使基类不带fly函数,要么在Penguin类对virtual fly函数进行重写。

在进行面向对象设计的时候,我们应该牢记:
public继承意味着is-a关系
适用于基类的每一件事情也都适用于派生类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值