美文网首页编程语言
面向对象程序设计第五节-继承与动态绑定(2020-01-30)

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

作者: _NewMoon | 来源:发表于2020-01-30 17:30 被阅读0次

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

    继承(Inheritance)

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

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

    class Quote {
        std::string isbn() const;
        virtual double net_price(std::size_t) const;
    };
    
    • 成员函数isbn() 返回书籍的编号,不涉及派生类的特殊性,定义在基类中即可。
    • net_price(size_t) 返回书籍的实际销售价格,根据用户购买该书的数量决定,所以基类和派生类都需要定义。

    虚函数

    上面的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++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/gfnithtx.html