对书本上继承与派生部分的描述一直看得不是很明白,做个小实验,增进理解:
#include<iostream> using namespace std; class A{ protected: //这里本来是private int m; public: A(int x); int get(); }; class Test:public A{ private: int a; const int b; public: Test(); void print(); }; Test::Test():a(4),b(5),A(3){ } void Test::print(){ cout<<a<<" "<<b<<" "<<m<<endl; } A::A(int x){ m=x; } int A::get(){ return m; } int main(){ Test t; t.print(); return 0; }类的继承:
派生类可以继承基类的所有成员。
在派生类中,成员可以按访问属性划分为一下4中:
(1)不可访问的成员。这是从基类私有成员继承而来的,派生类或是建立派生类对象的模块都没有办法访问到它们。如果从派生类继续派生新类,也是无法访问到的。
(2)私有成员。这里可以包括从基类继承过来的成员以及新增加的成员,在派生类内部可以访问,但是从建立派生类对象的模块中无法访问,继续派生,就变成了新的派生类中不可访问成员。
(3)保护成员。可能是新增加的也可能是从基类继承过来的,派生类内部可以访问,建立派生类对象的模块无法访问,进一步派生,在新的派生类中可能成为私有成员或者保护成员。
(4)公有成员。派生类、建立派生类的模块都可以访问,继续派生,可能是新派生类中的私有、保护或者公有成员。
内嵌类及其初始化:
类的初始化函数定义中可以添加内嵌对象成员的初始化列表。也可以添加基类的构造函数。
当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。对基本类型的数据成员也可以这样初始化。
在创建一个组合类的对象时,不仅它自身的构造函数的函数体将被执行,而且还将调用其内嵌对象的构造函数。这时构造函数的调用顺序如下: