首页 > 代码库 > 深入探索C++对象象模型--拷贝构造函数 &&多重继承 虚拟继承 内存分布

深入探索C++对象象模型--拷贝构造函数 &&多重继承 虚拟继承 内存分布

拷贝构造函数

如果没有定义拷贝构造函数,那么编译器会自动生成一个拷贝构造函数,但是这个拷贝构造函数是有一定限度的。

一般来说这个拷贝构造函数是按照位直接拷贝的,但是在有些情况下这种初始化是有问题的,在特殊的四种情况下是有问题的,在有问题的情况下,可以举例说明。

如果一个有多态性质的对象,子类赋值给父类,调用了拷贝构造函数,这个时候就需要给父类的虚拟函数表重新分配,使得虚拟函数表和子类不是同一个,这样bitwist就不能有效

 

对于在函数参数中调用拷贝构造函数,参数是实参的一根拷贝,对于函数的返回值调用了拷贝构造函数,编译器的做法是在函数参数中多可添加一个参数,这个参数是返回值的引用,在函数有返回值的时候,直接修改这个函数中多一个的参数即可,因为这个参数正好是函数返回值的引用。这也是编译器做的一个优化

 

在何种情况必须使用成员初始化列表来初始化成员:

1、  当初始化一个引用成员时

2、  当初始化一个const成员时

3、  当调用一个baseclass的构造函数,而它拥有一组参数时

4、  当调用一个成员对象的构造函数时,而它拥有一组参数时。

 

同时,初始化列表中初始化对象的顺序由class中的成员声明次序决定,不是初始化列表中的排列次序决定的。

 

Iorigin.x = 0;

Pt->x = 0;

从origin存取和从pt存取有什么重大的差异?当origin是一个derived class,而在其继承结构体中有一个virtual base class,并且被存取的成员是一个从该virtual base class继承而来的成员是,就会有重大的差异

 

多重继承和虚拟继承下虚函数表对应的内存分布(VS2008)

在多重继承下:

子类和第一个父类公用一个虚函数表指针,然后剩下的父类各自有各自的虚函数表指针,最后所得虚函数表指针和多重继承下父类的个数一样。

这个时候需要明白一个事情,如果在多重继承情况的父类也继承了共同的父类,那么这个时候在子类中会有两个父类的父类。

 

正是在这种情况下出现了虚拟继承,能够让父类的父类在子类中出现一次。怎么理解这个情况呢?什么是父类的父类呢?比如子类继承了两个父类,但是这两个父类也继承了同一个父类,这就是父类的父类,这个时候如果使用多重继承,就出现父类的父类出现两次的情况。这样也引出了虚拟继承。

 

在虚拟继承的情况下,有多少个父类就有多少个虚拟函数表指针,但是对于父类继承的同一个父类只出现一次,这个时候会有一个虚基类指针。假设一个子类多重继承了两个父类,这两个父类同时继承了同一个父类,这么一来,总共是四个类,最后的子类中有三个指针,两个是虚函数表指针,一个是虚基类指针

深入探索C++对象象模型--拷贝构造函数 &&多重继承 虚拟继承 内存分布