标签:
作为面向对象的程序设计来说,继承是非常重要的一个特点,面向对象程序设计(Object-Oriented Programming, OOP)的核心思想是数据抽象、继承和动态绑定。其中使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。下面什么主要介绍的是继承中基类和派生类之间的关系。
在基类中有两种类型的成员是我们需要注意的,一种是基类希望派生类继承的;一种是基类希望派生类覆盖的。如:基类Quote和其派生类Bulk_quote.
class Quote { public: std::string isbn() const; virtual double net_price(std::size_t n) const; }
这里成员函数isbn()是基类希望派生类继承的,派生类中不需要重新定义,而net_price是希望派生类覆盖的,派生类中有不一样的实现方式。这里基类Quote将希望派生覆盖的成员函数定义成虚函数,即在前面加上:virtual关键字。
那么,那些成员函数需要定义成虚函数了,即基类和派生类中都有各自的实现方式的时候,就需要在基类中将该成员函数定义成虚函数,希望派生类将其覆盖。动态绑定即是在我们使用基类的引用(或者指针)调用一个虚函数时发生的。这样程序就可以根据参数的不同来判断是调用基类的成员函数,还是调用派生类的成员函数。当然派生类也不是一定要重新定义基类中的虚函数,如果派生类没有覆盖基类中的虚函数,那么该虚函数就和其他普通函数一样,派生类就直接继承它在基类中的版本。
派生类和基类之间的类型转换
上面例子中基类Quote里面有成员:bookNo和price,派生类Bulk_quote中有:min_qty和discount.当派生类继承基类的时候,派生类中就有两部分(四个)成员:一部分是继承Quote的bookNo、price,一部分是自己定义的min_qty、discount。因为在派生类对象中含有与其基类对应的组成部分,所有我们能把派生类的对象当成基类对象来使用,而且我们也能将基类的指针或者引用绑定到派生类对象中的基类部分上。如下:
Quote item; //基类对象 Bulk_quote bulk; //派生类对象 Quote *p = &item; //p指向Quote对象 p = &bulk; //p指向bulk的Quote部分 Quote &r = bulk; //r绑定到bulk的Quote部分
注:在派生类对象中含有与其基类对应的组成部分,这一事实是继承的关键所在。
标签:
原文地址:http://www.cnblogs.com/pengjun-shanghai/p/5286690.html