继承
通过继承,可以利用已有的类来定义新的类。所定义的新的类不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。
例1
class Base{ }
class Derived : public Base { }
冒号指出Derived类的基类是Base类。例中表明Base类是公有基类,这被称为公有派生。使用公有派生,基类的公有成员将成为派生类的公有成员,基类的私有部分也将成为派生类的一部分,但只能通过基类的公有和保护方法访问。
继承关系下的构造与析构
创建派生类对象时,程序首先调用基类构造函数,再调用派生类构造函数。基类构造函数负责初始化继承的数据成员;派生类构造函数主要用于初始化新增的数据成员。派生类的构造函数总是调用一个基类构造函数,可以使用初始化器列表语法指明要使用的基类构造函数,否则将使用默认的基类构造函数。
派生类对象过期时,程序将首先调用派生类析构函数,再调用基类析构函数。
需要注意一点,基类应包含一个虚析构函数,即使有时并不需要析构函数。如果析构函数不是虚的,则将只调用对应于指针类型的析构函数。例如
...
Base * p = new Derived(...);
delete p;
...
这意味着只有Base的析构函数被调用,即使指针指向的是一个Derived对象。如果析构函数是虚的,将调用相应对象类型的析构函数。因此基类使用虚析构函数可以确保正确的析构函数序列被调用。
虚函数(virtual functions)
有时我们希望同一个方法在基类和派生类中的行为是不同的的,这时我们可以将基类方法声明为虚的,然后在派生类中重新定义基类的方法。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。
non-virtual函数:你不希望子类重新定义它。
virtual函数:你希望子类重新定义它,且它已有默认定义。
pure virtual函数:你希望子类一定要重新定义它,你对它没有默认定义。
网友评论