对象和继承
继承
继承是指从基类派生一个类但是不影响基类的实现.基类是继承的基础.派生类是一个全新的类,它继承了基类的所有属性,基类所有的公共方法成为派生类的公共方法,而且它们的实现是相同的.可以为派生类添加数据成员和其他方法,还可以修改从基类继承的方法.但是,对派生类所做的任何修改,完全不会影响基类.
多态
多态是一项重要的面向对象原则,它是指一个引用变量能够引用多个不同类型的对象.对变量进行运算时,将根据所引用的对象自动的选择相应的运算.
派生类与它的基类在类型上是兼容的,也就是说,基类的引用变量可以引用派生类的对象,但是反之则不可以.互为兄弟的类(如同一个类的多个派生类)在类型上是不兼容的.继承的使用通常会产生类的层次结构.
例子:
class Derived :public Base
{
//Any members that are not listed are inherited unchanged
//except for constructor,destructor,
//copy constructor,and operator=
public:
//Constructors,and destructors if defaults are not good;
//Base members whose definitions are to change in Derived;
//Additional public member functions;
private:
//Additional data members(generally private);
//Additional private member functions;
//Base members that should be disabled in Derived;
};
第一行后的public说明是公有继承,基类的所有公有成员在派生类中仍是公有的;如果没有public,那么就是私有继承,这时在派生类中,基类的公有成员也是隐藏的.
公共派生类可以访问基类的公有成员,但不能访问基类的私有成员。对于基类的保护成员,基类的用户不能直接访问,但基类的派生类可以直接访问。派生类只能通过派生类的实例来访问基类的保护成员。例子:
void Bulk_item::memfcn(const Bulk_item &d, const Item_base &b)
{
// attempt to use protected member
double ret = price; // ok: uses this->price
ret = d.price; // ok: uses price from a Bulk_item object
ret = b.price; // error: no access to price from an Item_base
}
The use of d.price is okay, because the reference to price is through an object of type Bulk_item. The use of b.price is illegal because Bulk_item has no special access to objects of type Item_base.
在没有继承关系时,类有两种使用者:一是类自身,另一个是普通的类的使用者。不同的类的使用者使类成员也有两种:public和private。普通的类的使用者只能访问公有成员,而类自身和友元则能访问类的公有和私有成员。
在继承关系下,又有了第三种类的使用者,即派生类。protected成员提供了派生类可以访问但普通使用者不能访问的机制。对于派生类,基类的私有成员也是不可以访问的。基类给派生类提供的接口是公有成员和保护成员的集合。
派生类不能改变基类中定义的虚函数的“虚”的属性。对虚函数的调用是C++中实现动态绑定的机制。动态绑定实现了在运行时确定调用哪一个版本的函数的功能。
友元关系不能被继承。
继承和静态成员
如果基类定义了一个静态成员,则整个类的层次只有一个同样的静态成员。不管基类派生了多少派生类,只有一个静态成员的实例。
阅读(1214) | 评论(0) | 转发(0) |