您的位置:首页 > 编程语言 > C语言/C++

C++多态

2011-04-19 20:55 211 查看
类似代码如下:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: