子类与父类之间的联系

一、子类对父类成员的访问权限

无论通过什么方式(public、protected、private)继承,

在子类内部均可访问父类中的public、protected成员,

private成员不可访问(如果想要子类能够访问,就定义为protected)

 

继承方式只影响外界通过子类对父类成员的访问权限。

    public继承,父类成员的访问权限全部保留至子类;

    protected继承,父类public成员的访问权限在子类中降至protected;

    private继承,父类public、protected成员的访问权限在子类中均降至private。

 

实例测试:

通过修改Son类的继承方式,观察变化。

二、子类的构造函数

子类和父类的构造函数的调用顺序

当创建子类对象时, 构造函数的调用顺序:

静态数据成员的构造函数 ->  父类的构造函数 ->  非静态的数据成员的构造函数 -> 自己的构造函数

 

注意:

无论创建几个对象, 该类的静态成员只构建一次, 所以静态成员的构造函数只调用1次!!!

#include <iostream>

#include <Windows.h>

using namespace std;

class M {

public:

    M() {

         cout << __FUNCTION__ << endl;

    }

};

 

class N {

public:

    N() {

         cout << __FUNCTION__ << endl;

    }

};

 

class A {

public:

    A() {

         cout << __FUNCTION__ << endl;

    }

};

 

class B : public A {

public:

    B() {

         cout << __FUNCTION__ << endl;

    }

private:

    M m1;

    M m2;

    static N ms;

};

N B::ms;  //静态成员

int main(void) {

    B b;

    system("pause");

}

执行:

N::N      静态数据成员的构造函数

A::A      父类的构造函数

M::M     非静态数据成员的构造函数

M::M     非静态数据成员的构造函数

B::B      自己的构造函数

三、子类的析构函数

子类的析构函数的调用顺序,和子类的构造函数的调用顺序相反!!!

记住,相反即可。

#include <iostream>

#include <Windows.h>

 

using namespace std;

 

class M {

public:

    M() {

         cout << __FUNCTION__ << endl;

    }

 

    ~M() {

         cout << __FUNCTION__ << endl;

    }

};

 

class N {

public:

    N() {

         cout << __FUNCTION__ << endl;

    }

 

    ~N() {

         cout << __FUNCTION__ << endl;

    }

};

 

class A {

public:

    A() {

         cout << __FUNCTION__ << endl;

    }

 

    ~A() {

         cout << __FUNCTION__ << endl;

    }

};

 

class B : public A {

public:

    B() {

         cout << __FUNCTION__ << endl;

    }

 

    ~B() {

         cout << __FUNCTION__ << endl;

    }

private:

    M m1;

    M m2;

    static N ms;

};

 

N B::ms;  //静态成员

 

int main(void) {

    {

         B b;

         cout << endl;

    }

   

    system("pause");

}

 

执行:

N::N

A::A

M::M

M::M

B::B

 

B::~B

M::~M

M::~M

A::~A

 

静态对象在程序终止时被销毁,所以:

静态成员的析构函数,在程序结束前,是不会被调用的!

posted @ 2020-05-31 20:27  CollisionDimension  阅读(783)  评论(0)    收藏  举报