派生类与基类之间的特殊关系

  • 继承是C++中一项非常重要的特性,继承派生使得C++的代码重用实现可能。基类与其派生类之间也有着较为特殊的关系
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class person{
    private:
    string name;
    double height;
    public:
    void Funciton_One();
    };
    class student : public person{
    private:
    int student_ID;
    public:
    void Funciton_TWo();
    }

由上述简要代码可以知道,student类从person类派生出来,继承了person类的实现(存储了基类数据成员)与接口(可以使用基类方法)。
重点
基类指针可以在不进行显式转换的情况下,指向派生类对象;同理,
基类引用也可以在不进行显式转换的情况下引用派生类对象。
但是,反过来确实不允许的,

1
2
3
4
5
6
person Zhang(……);
student Lee(……);
person * Temp1 = &Lee; // Allowed
person & Temp2 = Lee; // Allowed
student * temp1 = &Zhang; // Not Allowed
student & temp2 = Zhang; // Not Allowed

从上面代码可以看出这一特殊的关系。虽然基类引用和指针可以引用和指向派生类对象,但是基类引用和指针只能调用基类方法。这也正常,你试想,使用基类引用为派生类对象调用基类方法,显然是可以的,因为派生类继承了基类方法;相反,如果使用派生类引用为基类对象调用派生类方法,这明显会发生错误。
这一关系也存在于以基类引用(指针)作为形参的函数。