如果我们有两个定义:
Point3d origin,*pt = &origin;
用它们来存取data member,像这样:
origin.x = 0.0;
pt->x = 0.0
通过origin存取,和通过pt存取,有什么重大差异么?
当Point3d是一个derived class,而其继承结构中有一个virtual base class,并且被存取的member(如本例中的x)是一个从该virtual base class继承而来的member时,就会有重大区别。
我们不知道编译时期这个member真正的offset位置,也就是说我们不直到pt必然指向哪一种class type,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能解决;但如果用origin,就不会有这些问题,其类型无疑是Point3d class,而即使它继承自virtual base class,members的offset位置也在编译时期就固定了。一个积极进取的编译器甚至可以静态地经由origin就解决掉对x的存取。