编程语言

面向对象程序设计第五节-继承与动态绑定(2020-01-30)

2020-01-30  本文已影响0人  _NewMoon

本想这一节来学习一下多态性,但是看书看得有点懵,还是先记录学习一下前缀知识。

继承(Inheritance)

对于一些具有共同特征的对象,可以定义相似的类型对其相似关系进行建模,通过继承联系在一起的类构成一种层次关系,通常在层次关系的根部有一个基类(Base class),其他类则直接或间接地从基类继承而来,这些继承得到的类称为派生类(derived class),基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自的成员。

借用书上的例子,我们定义一个名为Quote的基类,Quote派生出另一个名为Bulk_quote(表示打折销售的书籍)的类。

class Quote {
    std::string isbn() const;
    virtual double net_price(std::size_t) const;
};

虚函数

上面的net_price()成员函数声明时前面有个关键字virtual,这里简单介绍一下虚函数(virtual function),在C++中,对基类与其派生类来说,有些成员函数,基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数

动态绑定(Dynamic bindning)

接着上面的例子,这里有一个函数,当我们要购买的书籍和购买的数量都已知时,它负责打印总的费用:

double print_total(ostream &os, const Quote &item, size_t n)
{
    //根据传入item形参的对象类型调用Quote::net_price或者Bulk_quote::net_price
    double res = item.net_price(n);
    os << "ISBN: " << item.isbn() << " # sold: " << n << "total due" << ret << endl;
    return ret;
}

从该函数的参数列表中我们可以看出,item形参时基类Quote的一个引用,但是这并不说明我们只能使用基类Quote的对象调用该函数,也可以使用Bulk_quote类的对象调用该函数,这就要说到动态绑定了,该函数会根据实际传入的对象类型来决定到底执行net_price的基类版本还是派生类版本:

Quote  basic;
Bulk_quote bulkf;
print_total(cout, basic, 20);    //调用Quote的net_price
print_total(cout, bulk, 20);     //调用Bulk_quote的net_price

所谓的动态绑定,就是可以使用同一段代码分别处理Quote和Bulk_quote的对象,由于函数的实际操作对象由运行时的实参确定,所以动态绑定又被称为运行时绑定(run-time binding)

Tip:在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。

继承和动态绑定都是面向对象程序设计的核心思想,这一节作为一个简单了解,为后来的继续学习打一个基础!

上一篇下一篇

猜你喜欢

热点阅读