初学C++:继承与内嵌类


对书本上继承与派生部分的描述一直看得不是很明白,做个小实验,增进理解:

  1. #include<iostream>   
  2. using namespace std;  
  3. class A{  
  4.     protected:            //这里本来是private   
  5.         int m;  
  6.     public:  
  7.         A(int x);  
  8.         int get();  
  9. };  
  10. class Test:public A{  
  11.     private:  
  12.         int a;  
  13.         const int b;  
  14.     public:  
  15.         Test();  
  16.         void print();  
  17. };  
  18.   
  19. Test::Test():a(4),b(5),A(3){  
  20. }  
  21.   
  22. void Test::print(){  
  23.     cout<<a<<" "<<b<<" "<<m<<endl;  
  24. }  
  25. A::A(int x){  
  26.     m=x;  
  27. }  
  28. int A::get(){  
  29.     return m;  
  30. }  
  31.   
  32. int main(){  
  33.     Test t;  
  34.     t.print();  
  35.     return 0;  
  36. }  

类的继承:

派生类可以继承基类的所有成员。

在派生类中,成员可以按访问属性划分为一下4中:

(1)不可访问的成员。这是从基类私有成员继承而来的,派生类或是建立派生类对象的模块都没有办法访问到它们。如果从派生类继续派生新类,也是无法访问到的。

(2)私有成员。这里可以包括从基类继承过来的成员以及新增加的成员,在派生类内部可以访问,但是从建立派生类对象的模块中无法访问,继续派生,就变成了新的派生类中不可访问成员。

(3)保护成员。可能是新增加的也可能是从基类继承过来的,派生类内部可以访问,建立派生类对象的模块无法访问,进一步派生,在新的派生类中可能成为私有成员或者保护成员。

(4)公有成员。派生类、建立派生类的模块都可以访问,继续派生,可能是新派生类中的私有、保护或者公有成员。

内嵌类及其初始化:

类的初始化函数定义中可以添加内嵌对象成员的初始化列表。也可以添加基类的构造函数。

    当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。因此,在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。对基本类型的数据成员也可以这样初始化。

在创建一个组合类的对象时,不仅它自身的构造函数的函数体将被执行,而且还将调用其内嵌对象的构造函数。这时构造函数的调用顺序如下:

(1)调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序。而内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序无关。

(2)执行本类构造函数的函数体。

如果有些内嵌对象没有出现在构造函数的初始化列表中,那么在第一步中,该内嵌对象的默认构造函数将被执行

有些数据成员的初始化必须在构造函数的初始化列表中进行,这些数据成员包括两大类,一类是那些没有默认构造函数的内嵌对象——因为这类对象初始化时必须提供参数,另一类是引用类型的数据成员——因为引用型变量必须在初始化时绑定引用的对象。如果一个类包括这两类成员,那么编译器不能够为这个类提供隐含的默认构造函数,这时必须编写显式的构造函数,并且在每个构造函数的初始化列表中至少为这两类数据成员初始化。

相关内容