类似代码如下:
class A
{
public:
virtual void Test(){}
};
class B:public A
{
public:
virtual void Test(){}
};
B b;
A a = b;
A * pA = &b;
a.Test();
pA->Test();
大家都知道a.Test调用的是A::Test,而pA->Test调用的是B::Test,那么为什么呢?
首先来看a.Test;其实很容易理解,这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,因此其就是一个A类型的变量。
而对于pA来说,其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现;因此如上面所说。同样引用也会达到如此的效果。
我想这就是所说的指针和引用不会引发内存中任何“与类型有关的内存委托操作”吧。