继承

子类和父类(基类和派生类)

派生的四个步骤:
1.继承基类成员:除构造函数与析构函数外全部继承。
2.改造基类成员:同名的成员变量和成员函数就会造成覆盖(遮蔽),父类和子类成员函数是不会构成重载的。此时基类的成员仍可以被访问,只要加上类名和域解析符。
例:派生类对象.基类名::成员函数;
3.发展新成员
4.重写构造函数与析构函数。

继承的特性:
1.构造函数调用:创建派生类的对象时,先依次调用基类的构造函数,后执行派生类的构造函数。
2.析构函数调用:与构造函数调用顺序相反。
3.特殊成员-友元:友元关系不能继承,基类的友元对派生类没有访问权限。
4.特殊成员-static成员:静态成员可以被继承,继承规则遵循普通变量,由于静态成员储存在静态区,派生类继承下来的静态成员和基类的那个静态成员是 同一个地址下的同一个变量。

继承的使用:

格式如下:
class 派生类名:继承方式 基类名{
派生类新增加的成员
};
实例:
class Student: public People{
// 派生类新增加的成员
}
继承方式可选,如果不写,默认为 private(结构体struct,默认是public)

1.不同继承方式对不同属性成员的影响

注:由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限,导致继承关系复杂,所以实际开发中我们一般使用 public。
2.使用using关键字可以改变基类成员在派生类中的访问权限。但是using只能改变基类中public和protected成员的访问权限,不能改变private成员的访问权限,因为基类中private成员在派生类中是不可见的,根本不能使用,所以基类中的private成员在派生类中无论如何都不能访问。
注:using会破坏程序的原有体系,不建议使用。

#include <iostream>

using namespace std;

class animal
{
public:
    animal():age(13)
    {
        cout << "调用构造函数-animal(基类)" << endl;
    }
    ~animal()
    {
        cout << "调用析构函数-animal(基类)" << endl;
    }
protected:
    int age;
};

class marine_animal:public animal
{
public:
    // 将 protected 改为 public
    using animal::age;
    marine_animal()
    {
        cout << "调用构造函数-marine animal(派生类)" << endl;
    }
    ~marine_animal()
    {
        cout << "调用析构函数-marine animal(派生类)" << endl;
    }
};

int main(int argc, char *argv[])
{
    marine_animal A;
    // age 被 using 关键字改为了 public,所以能直接调用。否则,protected 不能直接被对象调用。
    cout << "输出派生类的age:" << A.age << endl;
    return 1;
}

输出:
调用构造函数-animal(基类)
调用构造函数-marine animal(派生类)
输出派生类的age:13
调用析构函数-marine animal(派生类)
调用析构函数-animal(基类)

 

posted @ 2023-06-06 23:10  jason8826  阅读(23)  评论(0)    收藏  举报