类继承和类组合(内嵌类)初始化的不同

来源:互联网 发布:怎么取消淘宝延迟收款 编辑:程序博客网 时间:2024/04/30 02:36

为了说明方便,暂时设有下面三个类:

 

public:   A(int i);private:   int a;};class B{public:   B(int i);private:   int b;};class C:public A{public:   C(int i,int j);private:   int c;};

 

 

C是从类A继承过来的,那么类C的构造函数就应该这样写:

 

C::C(int i,int j):A(i){   c=j;}


 

但是,如果类C中多了一个private变量——B的对象的话,如下,所以C定义

 

class C{public:   C(int i,int j);private:   int c;   B b;};


 

那么此时C的定义就应该是:

 

C::C(int i,int j):b(i){   c=j;}


 

比较两种情况下C的构造函数的区别,我们就会发现,在继承的时候,子类的构造函数应该包括“基类所需的形参”,因此“:”之后是“基类名(基类参数)”,即“A(i)。但是,如果是类组合的话,子类的构造函数应该包括对象成员所需要的形参”,因此“:”之后是“对象名(参数)”即“b(i)”。注意到这些这话,我们才可以写一个包括继承并且含有内嵌对象的类的构造函数了。设类C定义如下:

 

class C:public A{public:   C(int i,int j,int k);private:   int c;   B b;};


 

构造函数如下:

 

C::C(int i,int j,int k):A(i),b(j){   c=k;}


 

务必要注意,什么时候是类名,什么时候是对象名。

可以这样记着:

类组合的时候,假设类B中包括类A的对象,那么在类B的构造函数中必须要有类A对象的声明,并且,声明的时候应该是

 

B::(int x,int y):a(x)而不是

B::(int x,int y):A(x)

 

而如果是继承的时候,假设类B是类A的子类,那么构造函数应该是

 

B::(int x,int y):A(x)而不是

B::(int x,int y):a(x)

 

原创粉丝点击