C++多态

类似代码如下:
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了,多于的数据都被丢弃,b对象的虚函数表不会被复制,A a时内存里已经有a的虚函数表了,因此其就是一个A类型的变量。
而对于pA来说,其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现;因此如上面所说。同样引用也会达到如此的效果。

Java里面实现就不同,A a = b这个再java里就是传递引用,相当于A * pA = &b;

我想这就是所说的指针和引用不会引发内存中任何“与类型有关的内存委托操作”吧。

转载网址:http://www.cppblog.com/windcsn/archive/2011/04/06/143482.html

posted @ 2011-04-19 20:55  蓝鸿鹄  阅读(121)  评论(0编辑  收藏  举报