再谈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关系
适用于基类的每一件事情也都适用于派生类

你可能感兴趣的:(Is-A)