子类与父类之间的联系
一、子类对父类成员的访问权限
无论通过什么方式(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
静态对象在程序终止时被销毁,所以:
静态成员的析构函数,在程序结束前,是不会被调用的!

浙公网安备 33010602011771号